python pandas:按行对条件进行分组

时间:2019-02-28 12:48:16

标签: python pandas

我有一个大熊猫数据框,试图从中建立一些行对。

我的df如下:

object_id increment location event
        0         1        d     A
        0         2        d     B
        0         3        z     C
        0         4        g     A
        0         5        g     B
        0         6        i     C
        1         1        k     A
        1         2        k     B
      ...       ...      ...  ...

对象ID描述特定对象。 增量是每次发生某事(跟踪订单)时都会增加的值,位置是此事发生的位置。最后一列是事件的类型。

现在,当A发生在某个位置,B发生在此之后,我想有时(但不总是)将它们分组,然后C是完全不同的事件,可以忽略。但是,我只想将位置相同,对象ID相同以及事件紧挨着列出时将它们组合在一起(因此,增量仅相差1)。

现在的问题是,对于同一对象,这些事件和增量号有时会再次从零开始。因此,我只想将它们在数据帧中彼此准确定位时进行分组(因此组最多应包含两个条目)。我很难做到这一点,因为groupby函数中没有比较行的选项。

任何提示我应该尝试什么方向?

编辑: 我正在寻找的输出正在形成以下形式的组:

group_id object_id increment location event
       0         0         1        d     A
       0         0         2        d     B
       1         0         3        z     C
       2         0         4        g     A
       2         0         5        g     B
       3         0         6        i     C
       4         1         1        k     A
       4         1         2        k     B
     ...       ...       ...      ...   ...

因此,仅当对中的“第一个”条目具有事件A和某个增量值x,而“第二个”条目具有事件B和增量值x + 1并因此是同一序列的一部分时,才形成组。希望这可以澄清我的问题!

1 个答案:

答案 0 :(得分:0)

您的问题并不十分清楚,因此在此问题中,您可能需要处理if语句中的条件,但这可能会对您有所帮助。

数据框已设置:

import pandas as pd
d = {'object_id': [0,0,0,0], 'increment': [1,2,3,4],
     'location': ['d', 'd', 'z', 'g'], 'event': ['A', 'B', 'C', 'A']}
df = pd.DataFrame(data=d)

让我们做一个列表来保存位置相同的索引。此外,您应该以适合您的方式添加条件,但您的问题尚不清楚。从那里可以运行以下功能:

lst = []
def functionGrouping(dataset):
    for i in range(len(df)-1):
        if df['event'].iloc[i+1] == 'C':
            i = i + 1
        else:
            if df['location'].iloc[i+1] == df['location'].iloc[i] and df['object_id'].iloc[i+1] == df['object_id'].iloc[i]:
                df['increment'].iloc[i+1] = df['increment'].iloc[i+1]  + df['increment'].iloc[i] 
                lst.append([i])

functionGrouping(df)

然后在其中删除您在函数中汇总的行。

for i in range(len(lst)):
    df=df.drop(df.index[i])

我希望这会有所帮助,但是您的问题并不清楚。对于将来的问题,请简化您的问题,并提供所需输出的示例。