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

rta7y2nd  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(98)

我将合并具有特定文本结构的 Dataframe 的多行
例如,我有

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

我找到了一种方法来创建列'Merge'来知道我是否需要合并。

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'时,我按名称分组。我知道这不是最好的方法,因为它只考虑了这个条件,但在我的 Dataframe 中,当列' Merge '等于' OK '时,我应该有其他行。然后,我按','拆分。
结果是

ID   Name  

 0   1    john smith

 1   1    robert g owens

 2   1    

 3   2    david lu

 4   2

另一个问题是,当我有超过4000行时,在我的真实示例中顺序不正确,我如何保持顺序并在必要时合并文本?

ktecyv1j

ktecyv1j1#

制作石斑鱼进行分组

cond1 = df['Name'].str.contains('\,$') | df['Merge'].eq('OK')
g = cond1[::-1].cumsum()

g(检查反转索引)

8    1
7    1
6    2
5    3
4    4
3    4
2    4
1    5
0    5
dtype: int32

删除,以及按ID和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

相关问题