【问题标题】:Compare row and previous row upon change in pandas dataframe在 pandas 数据框发生变化时比较行和上一行
【发布时间】:2017-01-16 18:12:12
【问题描述】:

我有以下形式的纵向数据

import pandas as pd

df = pd.DataFrame({
    'a': ['apples', 'plums', 'pears', 'pears', 'pears'],
    'b': ['grapes', 'grapes', 'grapes', 'grapes', 'bananas'],
    'c': [0, 0, 1, 0, 1]
})

还有一个比较列表的函数(这个细节并不重要)

def compare(old_fruit, new_fruit):
    if set(new_fruit) - set(old_fruit) == {'pears'}:
        return 1
    else:
        return 0

c 在我感兴趣的ab 发生变化时为1。我想找到c = 1 的行,获取ab 的值此时,加上上一行中ab 的值,使用我的函数比较它们,并将一个新系列添加到显示比较结果的数据框中。

对于上面的示例,我想要的操作将执行 compare(['plums', 'grapes'], ['pears', 'grapes'])compare(['pears', 'grapes'], ['pears', 'bananas']) 并将 Series [0, 0, 1, 0, 0] 添加到数据帧中,即所需的输出是如下数据帧:

pd.DataFrame({
    'a': ['apples', 'plums', 'pears', 'pears', 'pears'],
    'b': ['grapes', 'grapes', 'grapes', 'grapes', 'bananas'],
    'c': [0, 0, 1, 0, 1],
    'd': [0, 0, 1, 0, 0]
})

【问题讨论】:

  • 请添加一个运行示例和所需的输出。
  • 嗨。所需的输出是与数据帧长度相同的 0 和 1 数组,在本例中为 [0, 0, 1, 0, 0],在执行比较函数并返回 1 时为 1,否则为 0。对于给出的两个示例,我的 compare() 函数分别返回 1 和 0。不幸的是,我不知道如何为其余部分编写一个运行示例。
  • 我的意思是可以从你的问题中复制粘贴的代码,这样我就可以在我的电脑上运行它(使用虚拟数据、导入和所需的输出作为注释)。
  • 我已经添加了导入语句和所需的输出。 df 是虚拟数据。如果我遗漏了其他内容,请告诉我。
  • 你快到了 :) 我想要一个块,我可以在我的 IDE 中复制并简单地运行它。

标签: python pandas compare


【解决方案1】:

以矢量化的方式准确地做你想要比较的事情:

df_set = df[['a', 'b']].apply(set, axis=1)

df_set
Out[38]: 
0    {grapes, apples}
1     {grapes, plums}
2     {grapes, pears}
3     {grapes, pears}
4    {bananas, pears}
dtype: object

(df_set - df_set.shift()) == {'pears'}
Out[39]: 
0    False
1    False
2     True
3    False
4    False
dtype: bool

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多