我的数据框包含如下文字数据
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。
答案 0 :(得分:0)
如果要转换性行的数据框(每列中可能有NaN
个条目),可能没有直接的pandas
方法。
您需要一些代码来分配name
列中的值,以便pandas可以知道bob
和@gmail.com
的拆分行属于同一用户Bob
。
您可以使用name
或fillna
方法向前一位用户填充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
然后您可以使用groupby
和sum
作为聚合函数。
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 pandas和pandas.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}}将代码扩展到更复杂的数据之类的东西。