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

时间:2018-07-27 22:03:26

标签: python pandas

我有两个由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

感谢您的反馈!

2 个答案:

答案 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