我有一个大熊猫数据框,试图从中建立一些行对。
我的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并因此是同一序列的一部分时,才形成组。希望这可以澄清我的问题!
答案 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])
我希望这会有所帮助,但是您的问题并不清楚。对于将来的问题,请简化您的问题,并提供所需输出的示例。