【问题标题】:Drop rows in dataframe that have the same value in many columns删除数据框中在许多列中具有相同值的行
【发布时间】:2018-08-18 23:22:00
【问题描述】:

我有一个如下表,列名随时间变化。我只想保留这些行,其中任何 ww 与 ww12 之间存在差异。在下表中,我想保留第 3 行和第 7 行并删除其他行。 在第 3 行 ww17 # ww12 在第 7 行 ww16 # ww12 请帮助我,在此先感谢。

    Type WW12       WW13        WW14        WW15        WW16        WW17        WW18        WW19        WW20
0   AA  1.999857143 1.999857143 1.999857143 1.999857143 1.999857143 1.999857143 1.999857143 1.999857143 1.999857143
1   AA  24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000
2   AA  1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143
3   BB  1.457285714 1.457285714 1.457285714 1.457285714 1.457285714 1.863928571 1.863928571 1.863928571 1.863928571
4   BB  24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000
5   BB  24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000
6   BB  1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143 1424.593143
7   BB  1.863928571 1.863928571 1.863928571 1.863928571 2.878857143 2.878857143 2.878857143 2.878857143 2.878857143
8   BB  24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000    24000000

【问题讨论】:

    标签: python excel pandas numpy


    【解决方案1】:

    使用boolean indexing:

    #create index by column Type
    df1 = df.set_index('Type')
    #compare column WW12 for not equal and get at least one True per rows
    df2 = df[df1.ne(df1['WW12'], 0).any(1).values]
    #if want compare by second column (first is Index here)
    #df2 = df[df1.ne(df1.iloc[:, 0], 0).any(1).values]
    

    如果只想比较第二列:

    df2 = df[df.iloc[:, 1:].ne(df.iloc[:, 1], axis=0).any(axis=1)]
    print (df2)
      Type      WW12      WW13      WW14      WW15      WW16      WW17      WW18  \
    3   BB  1.457286  1.457286  1.457286  1.457286  1.457286  1.863929  1.863929   
    7   BB  1.863929  1.863929  1.863929  1.863929  2.878857  2.878857  2.878857   
    
           WW19      WW20  
    3  1.863929  1.863929  
    7  2.878857  2.878857  
    

    说明

    按位置选择第二列:

    print (df.iloc[:, 1])
    0    1.999857e+00
    1    2.400000e+07
    2    1.424593e+03
    3    1.457286e+00
    4    2.400000e+07
    5    2.400000e+07
    6    1.424593e+03
    7    1.863929e+00
    8    2.400000e+07
    Name: WW12, dtype: float64
    

    按位置删除第一列并按第二列进行比较:

    print (df.iloc[:, 1:].ne(df.iloc[:, 1], axis=0))
    
        WW12   WW13   WW14   WW15   WW16   WW17   WW18   WW19   WW20
    0  False  False  False  False  False  False  False  False  False
    1  False  False  False  False  False  False  False  False  False
    2  False  False  False  False  False  False  False  False  False
    3  False  False  False  False  False   True   True   True   True
    4  False  False  False  False  False  False  False  False  False
    5  False  False  False  False  False  False  False  False  False
    6  False  False  False  False  False  False  False  False  False
    7  False  False  False  False   True   True   True   True   True
    8  False  False  False  False  False  False  False  False  False
    

    any 比较,每行至少有一个True

    print (df.iloc[:, 1:].ne(df.iloc[:, 1], axis=0).any(axis=1))
    0    False
    1    False
    2    False
    3     True
    4    False
    5    False
    6    False
    7     True
    8    False
    dtype: bool
    

    【讨论】:

    • 在第一种解释中,value 在最后使用,第二种方法不使用。请解释一下。
    • @PIG - 当然。如果将set_index 用于df1,然后选择原始df 的值,则对齐数据存在问题-df.indexdf1.index 不同。所以为没有索引的numpy数组添加了.values,所以没有对齐。
    猜你喜欢
    • 2012-01-13
    • 2014-12-15
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多