python pandas 将两行或多行文本合并为一行

python pandas merge two or more lines of text into one line

我有如下文本数据的数据框,

    name | address                  | number 
1   Bob    bob                        No.56
2          @gmail.com           
3   Carly  carly@world.com            No.90
4   Gorge  greg@yahoo     
5          .com                   
6                                     No.100

想做成这个框架

    name | address               | number 
1   Bob    bob@gmail.com           No.56
2   Carly  carly@world.com         No.90                 
3   Gorge  greg@yahoo.com          No.100

我正在使用 pandas 读取文件但不确定如何使用合并或连接。

如果您想转换性别行的数据框(每列中可能有 NaN 个条目),可能没有直接的 pandas 方法。

您将需要一些代码来分配 name 列中的值,以便 pandas 可以知道 bob@gmail.com 的拆分行属于同一用户Bob.

您可以使用 fillnaffill 方法用其前面的用户填充列 name 中的每个空条目,请参阅 pandas dataframe missing data

df ['name'] = df['name'].ffill()

# gives
    name    address number
0   Bob bob No.56
1   Bob @gmail.com  
2   Carly   carly@world.com No.90
3   Gorge   greg@yahoo  
4   Gorge   .com    
5   Gorge       No.100

然后可以使用groupbysum作为聚合函数

df.groupby(['name']).sum().reset_index()

# gives
    name    address number
0   Bob bob@gmail.com   No.56
1   Carly   carly@world.com No.90
2   Gorge   greg@yahoo.com  No.100

您可能会发现 NaN 和白色 space 之间的转换很有用,请参阅 Replacing blank values (white space) with NaN in pandas and pandas.DataFrame.fillna

如果 name 列包含唯一值,

print df

    name          address  number
0    Bob              bob   No.56
1    NaN       @gmail.com     NaN
2  Carly  carly@world.com   No.90
3  Gorge       greg@yahoo     NaN
4    NaN             .com     NaN
5    NaN              NaN  No.100

df['name'] = df['name'].ffill()
print df.fillna('').groupby(['name'], as_index=False).sum()

    name          address  number
0    Bob    bob@gmail.com   No.56
1  Carly  carly@world.com   No.90
2  Gorge   greg@yahoo.com  No.100

您可能需要 ffill()bfill()[::-1].groupby('name').apply(lambda x: ' '.join(x['address']))strip()lstrip()rstrip()replace() 将上面的代码扩展到更复杂的数据。