【问题标题】:Pandas comparing two rows in a database熊猫比较数据库中的两行
【发布时间】:2021-06-04 09:02:53
【问题描述】:

我有一个这样的数据框;

df = pd.DataFrame(np.array([['apple', 'golden', 3], ['apple', 'green', 6], ['banana', 'golden', 9], ['apple', 'golden', 5], ['apple', 'green', 6], ['banana', 'golden', 6]]),
                   columns=['Column1', 'Column2', 'Column3'])
df

    Column1 Column2 Column3
0   apple   golden  3
1   apple   green   6
2   banana  golden  9
3   apple   golden  5
4   apple   green   6
5   banana  golden  6

我想将“Column1”行与在新的 Column4 中迭代进行比较。如果有差异我想写下True,如果不是False。

    Column1 Column2 Column3 Column4
0   apple   golden  3       False
1   apple   green   6       False
2   banana  golden  9       True
3   apple   golden  5       True
4   apple   green   6       False
5   banana  golden  6       True

最后,如果比较结果为真,我想将 Column1 项添加到列表中。

list = ['banana']

【问题讨论】:

    标签: python pandas compare row


    【解决方案1】:

    将不等于的移位值与将第一个值替换为原始Column1 进行比较fillna

    df['Column4'] = df.Column1.shift().fillna(df.Column1).ne(df.Column1)
    
    print (df)
      Column1 Column2  Column3  Column4
    0   apple  golden        3    False
    1   apple   green        6    False
    2  banana  golden        9     True
    3   apple  golden        5     True
    4   apple   green        6    False
    5  banana  golden        6     True
    

    对于列表不要使用list,因为python代码字:

    L = df.loc[df['Column4'], 'Column1'].unique().tolist()
    print (L)
    ['banana', 'apple']
    

    【讨论】:

    • 我没有像香蕉这样的常数值。值正在发生变化,例如:香蕉、苹果、菠萝。我应该使用 for 循环吗?
    • @CanerUçal - 如果性能很重要,熊猫最好不要使用循环。添加了矢量化解决方案来回答。
    • 当我使用 .shift() 方法时,最后一行比较消失了。
    • @CanerUçal - 在我的解决方案中第一个值消失了 - 它被 .fillna(df.Column1) 替换为原始值,所以如果比较不等于 ne 总是第一个值False
    • 对不起,我是 python 新手。我现在明白了。有用。非常感谢。
    【解决方案2】:

    如果我正确理解您的问题,这应该有效:

    df['Column4'] = np.where(df.Column1.shift(1) != df.Column1, True, False)
    df['Column4'][0] = False  #Since the above method would set the first row as True comparing it to nothing
    
    
    list = df['Column1'].loc[df.Column4].to_list()
    

    Column4 中的值是True 时,上面的行将给出Column1 中的值列表。

    【讨论】:

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