【问题标题】:Comparing rows of pandas dataframe (rows have some overlapping values)比较熊猫数据框的行(行有一些重叠的值)
【发布时间】:2021-10-13 20:03:48
【问题描述】:

我有一个包含 21 列的 pandas 数据框。我专注于具有完全相同列数据值的行子集,但每行唯一的 6 个除外。我不知道这 6 个值对应于哪个列标题是先验的。

我尝试将每一行转换为索引对象,并对两行进行了设置操作。例如。

row1 = pd.Index(sample_data[0])
row2 = pd.Index(sample_data[1])
row1 - row2 

返回一个 Index 对象,其中包含 row1 独有的值。然后我可以手动推断哪些列具有唯一值。

如何以编程方式在初始数据框中获取这些值对应的列标题?或者,有没有办法比较两个或多个数据框行并提取每行的 6 个不同列值以及相应的标题?理想情况下,最好生成一个具有唯一列的新数据框。

具体来说,有没有办法使用集合操作来做到这一点?

谢谢。

【问题讨论】:

  • 所以有一组行是 15-in-common,6-不同,还有其他行不遵循这种模式? [IOW,我们必须检测这个“行子集”还是已经完成了?]
  • 你可以发布几个示例行吗?

标签: python pandas dataframe


【解决方案1】:

这是一个只返回前两行不同的列的快速解决方案。

In [13]: df = pd.DataFrame(zip(*[range(5), list('abcde'), list('aaaaa'),
...                              list('bbbbb')]), columns=list('ABCD'))

In [14]: df
Out[14]: 
   A  B  C  D
0  0  a  a  b
1  1  b  a  b
2  2  c  a  b
3  3  d  a  b
4  4  e  a  b

In [15]: df[df.columns[df.iloc[0] != df.iloc[1]]]
Out[15]: 
   A  B
0  0  a
1  1  b
2  2  c
3  3  d
4  4  e

还有一种解决方案,可以在整个框架中查找具有多个唯一值的所有列。

In [33]: df[df.columns[df.apply(lambda s: len(s.unique()) > 1)]]
Out[33]: 
   A  B
0  0  a
1  1  b
2  2  c
3  3  d
4  4  e

【讨论】:

    【解决方案2】:

    您实际上并不需要索引,您可以只比较两行并使用它来过滤具有列表理解的列。

    df = pd.DataFrame({"col1": np.ones(10), "col2": np.ones(10), "col3": range(2,12)})
    row1 = df.irow(0)
    row2 = df.irow(1)
    unique_columns = row1 != row2
    cols = [colname for colname, unique_column in zip(df.columns, bools) if unique_column]
    print cols # ['col3']
    

    如果您知道每列的标准值,则可以将所有行转换为布尔列表,即:

    standard_row = np.ones(3)
    columns = df.columns
    unique_columns = df.apply(lambda x: x != standard_row, axis=1)
    unique_columns.apply(lambda x: [col for col, unique_column in zip(columns, x) if unique_column], axis=1)
    

    【讨论】:

      【解决方案3】:

      进一步了解@jeff-tratner 的回答

      1. 生成两行之间相同单元格的真值表(在这种情况下通过它们的索引位置选择):

        uq = di2.iloc[0] != di2.iloc[1]

      2. 获取相同单元格的列列表:

        uq[uq==True].index.to_list()

      或者获取不同单元格的列列表:

      uq[uq!=True].index.to_list()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2021-10-27
        相关资源
        最近更新 更多