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

时间:2017-02-15 03:10:05

标签: python pandas merge concat

我的数据框包含如下文字数据

    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来读取文件,但不确定如何使用merge或concat。

2 个答案:

答案 0 :(得分:0)

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

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

您可以使用namefillna方法向前一位用户填充ffill列中的每个空条目,请参阅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和空格有用之间进行转换,请参阅Replacing blank values (white space) with NaN in pandaspandas.DataFrame.fillna

答案 1 :(得分:0)

如果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(),{{ 1}}将代码扩展到更复杂的数据之类的东西。