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
.
您可以使用 fillna
或 ffill
方法用其前面的用户填充列 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
然后可以使用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
和白色 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()
将上面的代码扩展到更复杂的数据。
我有如下文本数据的数据框,
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
.
您可以使用 fillna
或 ffill
方法用其前面的用户填充列 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
然后可以使用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
和白色 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()
将上面的代码扩展到更复杂的数据。