【问题标题】:Compare two columns of data using pandas, if same values in rows, update使用 pandas 比较两列数据,如果行中的值相同,则更新
【发布时间】:2018-07-28 08:14:42
【问题描述】:

我有两个由 pd.read_csv 使用 pandas 读取的数据帧。

数据 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

感谢您的反馈!

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      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
      

      如果顺序很重要,您可以使用自定义辅助函数:

      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
      

      【讨论】:

      • 请检查您的输出。
      • 谢谢,实际上名称列的顺序很重要。但是通过您的输入,我能够得到我想要的结果。这是最终的代码。 df1 = df1.fillna('') df2 = df2.fillna('') print(df1) df1['first'] = df1['name'].str.split(',').str[0] df1 ['rest'] = df1['name'].str.split(',').str[1:].apply(','.join) df1['name'] =df1.merge(df2, 如何='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(',')
      • 哇,好多了。伟大的cmets!真的很感激!
      • @cinemania 如果这些答案中的任何一个对您有所帮助,请考虑投票/接受它们!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多