我有这种格式的pandas数据框:
id Role time text
id1 A t1 text1
id1 B t2 text2
id1 B t3 text3
id1 A t4 text4
id1 B t5 text5
id1 A t6 text6
id1 A t7 text7
id2 A t8 text8
id2 B t9 text9
id2 B t10 text1
id2 B t11 text10
id2 A t12 text11
id2 A t13 text12
我想形成一个数据帧甚至是这样的文本文件:
id Role text
id1 A text1
id1 B text2, text3
id1 A text4
id1 B text5
id1 A text6, text7
id2 A text8
id2 B text9, text10, text11
id2 A text12, text13
id2 B text11
id2 A text12, text13
或者采用文本格式:
text1
text2, text3
text4
text5
text6, text7
==NEXT ID==
text8
text9, text10, text11
text12, text13
text11
text12, text13
我已经在熊猫中使用过group by但我无法完成它,因为按角色分组会将al text放在一起。感谢。
答案 0 :(得分:4)
检查'Role'
是否等于其先前值,并执行累计求和以模拟第三个分组。
g3 = (df.Role != df.Role.shift()).cumsum().rename('clump')
df.groupby(['id', 'Role', g3], sort=False).text.apply(', '.join).reset_index()
id Role clump text
0 id1 A 1 text1
1 id1 B 2 text2, text3
2 id1 A 3 text4
3 id1 B 4 text5
4 id1 A 5 text6, text7
5 id2 A 5 text8
6 id2 B 6 text9, text1, text10
7 id2 A 7 text11, text12
将其转储为文本文件
g3 = (df.Role != df.Role.shift()).cumsum().rename('clump')
d1 = df.groupby(['id', 'Role', g3], sort=False).text.apply(', '.join).reset_index()
for n, g in d1.groupby('id').text:
print(g)
print()
# g.to_csv('{}.csv'.format(n))
0 text1
1 text2, text3
2 text4
3 text5
4 text6, text7
Name: text, dtype: object
5 text8
6 text9, text1, text10
7 text11, text12
Name: text, dtype: object