如何根据特定的结构连接数据框中的多行文本



我将合并具有特定文本结构的数据框的多行

例如,我有
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

最新更新