我有两个由pd.read_csv使用熊猫读取的数据框。
数据1:
animal name
0 lion a
1 tiger b,c
2 tiger b,c
3 bear d,e
4 bear d,e
数据2:
0 lion w
1 tiger x,y
2 bear z
我想在名称列的第一个值以逗号分隔(数据1)之后将动物列(数据1)与第一列(数据2)和插入第二列(数据2)进行比较。
这是我想要的结果。
animal name
0 lion a,w
1 tiger b,x,y,c
2 tiger b,x,y,c
3 bear d,z,e
4 bear d,z,e
我该怎么做?
由于下面的输入,我创建了这样的代码,并且效果很好。 实际上,我想在第一个字符串之后插入df2名称列。
import sys
import pandas as pd
df1 = pd.read_csv("df1.dat", delimiter = '\t')
df2 = pd.read_csv("df2.dat", delimiter = '\t')
df1 = df1.fillna('')
df2 = df2.fillna('')
df1['first'] = df1['name'].str.split(',').str[0]
df1['rest'] = df1['name'].str.split(',').str[1:].apply(','.join)
df1['name'] =df1.merge(df2, how='inner', on='animal')[['first', 'name_y', 'rest']].apply(','.join, 1)
df1.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
df2 = df1['name'].str.replace(',,',',')
df2 = df2.str.rstrip(',')
这将清除NaN情况下的数据,并删除不需要的逗号。 例如,
df1:
animal name
lion a
tiger b,c
tiger b,c
bear d,f,g
bear d,f,g
df2:
animal name
lion
tiger x,y
bear
结果:
0 a
1 b,x,y,c
2 b,x,y,c
3 d,f,g
4 d,f,g
感谢您的反馈!
答案 0 :(得分:1)
这应该做到:
data_merged = df1.merge(df2, how='inner', on='animal')
data_merged['name'] = data_merged.name_x+','+data_merged.name_y
data_merged.drop(['name_x','name_y'], axis=1, inplace=True)
data_merged
animal name
0 lion a,w
1 tiger b,c,x,y
2 tiger b,c,x,y
3 bear d,e,z
4 bear d,e,z
答案 1 :(得分:1)
使用 merge
和 apply
:
df1['name'] = df1.merge(
df2, how='inner', on='animal'
)[['name_x', 'name_y']].apply(','.join, 1)
animal name
0 lion a,w
1 tiger b,c,x,y
2 tiger b,c,x,y
3 bear d,e,z
4 bear d,e,z
如果顺序很重要,则可以使用自定义帮助器功能:
def helper(x):
foo, bar = [x[i].split(',') for i in ['name_x', 'name_y']]
return ','.join(foo[:1] + bar + foo[1:])
df1.merge(df2, how='inner', on='animal')[['name_x', 'name_y']].apply(helper, 1)
0 a,w
1 b,x,y,c
2 b,x,y,c
3 d,z,e
4 d,z,e
dtype: object