简体   繁体   English

使用熊猫比较两列数据,如果行中的值相同,则更新

[英]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 : 使用mergeapply

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM