【发布时间】:2020-11-10 19:57:24
【问题描述】:
开始 pandas df 是:
df = pd.DataFrame({
'event':['caller', 'X', 'y', 'X', 'caller', 'caller', 'z', 'z', 'X', 'X', 'w', 'X', 'y', 'X', 'z', 'caller'],
'value':['c1', 'x1', 'yy', 'x2', 'c2', 'c3', 'zz', 'zz', 'x1', 'x2', 'ww', 'x3', 'yy', 'x4', 'z1', 'c4']
})
df
Out[24]:
event value
0 caller c1
1 X x1
2 y yy
3 X x2
4 caller c2
5 caller c3
6 z zz
7 z zz
8 X x1
9 X x2
10 w ww
11 X x3
12 y yy
13 X x4
14 z z1
15 caller c4
目标是将event==X 所在的所有值汇总到一个value 中,这可能是(或不是!)每个部分其中event==caller。
注意*:
-
event == X在caller部分中可能是连续的,也可能不是连续的。 - 在某些情况下,
event == X可能根本不在caller部分的某些部分中。 - 可能存在重复的情况,例如
event == z。这些应该不汇总。
因此,为简单起见,仅应聚合可能出现在 caller 部分中任何位置的 event==X 的值。
最终的 df (`df_aggr) 应该如下所示:
df_aggr = pd.DataFrame({
'event':['caller', 'X', 'y', 'caller', 'caller', 'z', 'z', 'X', 'w', 'y', 'z', 'caller'],
'value':['c1', 'x1 x2', 'yy', 'c2', 'c3', 'zz', 'zz', 'x1 x2 x3 x4', 'ww', 'yy', 'z1', 'c4']
})
df_aggr
Out[28]:
event value
0 caller c1
1 X x1 x2
2 y yy
3 caller c2
4 caller c3
5 z zz
6 z zz
7 X x1 x2 x3 x4
8 w ww
9 y yy
10 z z1
11 caller c4
它必须在 python2.7 和 pandas=0.15.2 上工作。
更新:
-----pandas=0.15.2的解决方案-----
根据 David 的回答,如果有人可能需要支持 pandas==0.15.2,则必须对其进行调整以适应版本之间的差异。
In [36]: df = pd.DataFrame({
...: 'event':['caller', 'X', 'y', 'X', 'caller', 'caller', 'z', 'z', 'X', 'X', 'w', 'X', 'y', 'X', 'z', 'caller'],
...: 'value':['c1', 'x1', 'yy', 'x2', 'c2', 'c3', 'zz', 'zz', 'x1', 'x2', 'ww', 'x3', 'yy', 'x4', 'z1', 'c4']
...: })
...:
...: s = (df['event'] == 'caller').cumsum()
...: df['value'] = df['value'].where(df['value'].mask(df['event'] == 'X'), df.groupby(['event', s])['value'].transform(' '.join))
...: df = df[~((df.duplicated()) & (df['event'] == 'X'))].reset_index(drop=True)
...:
In [37]: df
Out[37]:
event value
0 caller c1
1 X x1 x2
2 y yy
3 caller c2
4 caller c3
5 z zz
6 z zz
7 X x1 x2 x3 x4
8 w ww
9 y yy
10 z z1
11 caller c4
In [38]:
【问题讨论】:
标签: python pandas python-2.7