[英]Compare two columns of data using pandas, if same values in rows, update
I have two dataframes read by pd.read_csv using pandas. 我有两个使用pd.read_csv读取的数据框。
data 1: 数据1:
animal name
0 lion a
1 tiger b,c
2 tiger b,c
3 bear d,e
4 bear d,e
data 2: 数据2:
0 lion w
1 tiger x,y
2 bear z
I would like to compare animal column (data 1) against 1st column (data2) and plug-in 2nd column (data2) after the first value of the name column delimited by comma (data 1). 我想将名称列的第一个值用逗号分隔(数据1)后,将动物列(数据1)与第一列(数据2)和插件第二列(数据2)进行比较。
This is the result I want. 这是我想要的结果。
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
How to I do this? 我该怎么做?
Thanks to the inputs below, I have created the code like this and works great. 感谢下面的输入,我创建了这样的代码,效果很好。 In fact, I wanted to plug in the df2 name column after the first string. 实际上,我想在第一个字符串之后插入df2 name列。
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(',')
This cleans out data in case of NaN and removes the not needed commas. 如果出现NaN,这将清除数据并删除不需要的逗号。 For example, 例如,
df1: df1:
animal name
lion a
tiger b,c
tiger b,c
bear d,f,g
bear d,f,g
df2: df2:
animal name
lion
tiger x,y
bear
Results in: 结果是:
0 a
1 b,x,y,c
2 b,x,y,c
3 d,f,g
4 d,f,g
Thanks for the feedback! 感谢您的反馈!
This should do it: 应该这样做:
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
Using merge
with apply
: 使用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
If order is important, you can use a custom helper function: 如果顺序很重要,则可以使用自定义帮助函数:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.