我将合并具有特定文本结构的数据框的多行
例如,我有df = pd.DataFrame([
(1, 'john', 'merge'),
(1, 'smith,', 'merge'),
(1, 'robert', 'merge'),
(1, 'g', 'merge'),
(1, 'owens,', 'merge'),
(2, 'sarah will', 'OK'),
(2, 'ali kherad', 'OK'),
(2, 'david', 'merge'),
(2, 'lu,', 'merge'),
], columns=['ID', 'Name', 'Merge'])
ID Name Merge
1 john merge
1 smith, merge
1 robert merge
1 g merge
1 owens, merge
2 sarah will OK
2 ali kherad OK
2 david merge
2 lu, merge
目标是有一个数据帧来合并行中的文本,像这样
ID Name
0 1 john smith
1 1 robert g owens
2 2 sarah will
3 2 ali kherad
4 2 david lu
我找到了一种方法来创建列"合并",以知道我是否需要合并。然后我试了这个
df = pd.DataFrame(df[df['Merge']=='merge'].groupby(['ID','Merge'], axis=0)['Name'].apply(' '.join))
res = df.apply(lambda x: x.str.split(',').explode()).reset_index().drop(['Merge'], axis=1)
首先,我将列'Merge'等于'Merge'时的名称分组。我知道这不是最好的方式,因为它只考虑这个条件,但在我的数据框中,当列"合并"等于"OK"时,我应该有其他行。然后用','分割。
结果
ID Name
0 1 john smith
1 1 robert g owens
2 1
3 2 david lu
4 2
另一个问题是,在我的实际示例中,当我有超过4000行时,顺序是不正确的。如何保持顺序并在必要时合并文本?
make grouper for grouping
cond1 = df['Name'].str.contains(',$') | df['Merge'].eq('OK')
g = cond1[::-1].cumsum()
g
(chk反向索引)
8 1
7 1
6 2
5 3
4 4
3 4
2 4
1 5
0 5
dtype: int32
remove, and groupby by ID and g
out = (df['Name'].str.replace(',$', '', regex=True)
.groupby([df['ID'], g], sort=False).agg(' '.join)
.droplevel(1).reset_index())
out
ID Name
0 1 john smith
1 1 robert g owens
2 2 sarah will
3 2 ali kherad
4 2 david lu