【问题标题】:Add two more columns to csv file based on matching values of other csv根据其他 csv 的匹配值向 csv 文件添加两列
【发布时间】:2018-09-28 15:37:00
【问题描述】:

我有两个 csv 文件

csv1:

csv2:

我需要处理的是:

获取csv1文件的c列的每个值,并与csv2的number列匹配。

如果 csv2 的任何行与该数字匹配,则将新列 c_text 添加到 csv1 中,该列将包含 text 列的值以匹配 csv2 的行

对 csv1 的列 d 重复上述过程,并将新列 d_text 添加到 csv1

这是我最后需要的东西

我是熊猫新手。我如何使用熊猫来做到这一点。

【问题讨论】:

  • pd.merge() 是你要找的

标签: python-3.x pandas


【解决方案1】:

你可以使用apply():

csv1['c_text'] = csv1['c'].apply(lambda x: csv2[csv2['number']==x]['text'].values[0])
csv1['d_text'] = csv1['d'].apply(lambda x: csv2[csv2['number']==x]['text'].values[0])

产量:

   a  b    c    d c_text d_text
0  1  4  101  201   val1   val4
1  2  5  105  202   val2   val5
2  3  6  107  203   val3   val6

就使用merge() 的选项而言,这将产生相同的输出:

csv1 = csv1.merge(csv2, left_on='c', right_on='number', how='left')
csv1 = csv1.merge(csv2, left_on='d', right_on='number', how='left')
csv1 = csv1.rename(columns={'text_x': 'c_text', 'text_y': 'd_text'})[['a','b','c','d','c_text','d_text']]

【讨论】:

  • 在这种情况下使用应用比合并有优势吗?真的很好奇
  • 恕我直言,它更具可读性,但我承认它不太稳定,因为它假定 c 或 d 中的每个值 csv1 将在 number 中具有相应的行cv2 的列,否则会抛出错误。我将添加一个merge() 选项作为替代方案,因为对于大型数据帧,它很可能在性能方面优于apply()。
【解决方案2】:

下面是一些可以解决问题的方法:

df1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c':[101, 105, 107], 'd':[201, 202, 203]})

df2 = pd.DataFrame({'number': [101, 105, 107, 201, 202, 203, 205, 2010, 310], 'text': ["val_{x}".format(x=y + 1) for y in range(9)]})

df1

   a  b    c    d
0  1  4  101  201
1  2  5  105  202
2  3  6  107  203

df2

   number   text
0     101  val_1
1     105  val_2
2     107  val_3
3     201  val_4
4     202  val_5
5     203  val_6
6     205  val_7
7    2010  val_8
8     310  val_9
merged = df1.merge(df2, left_on='c', right_on='number', how='left')

merged

   a  b    c    d  number   text
0  1  4  101  201     101  val_1
1  2  5  105  202     105  val_2
2  3  6  107  203     107  val_3

output = merged.merge(df2, left_on='d', right_on='number', how='left')[['a', 'b', 'c', 'd', 'text_x', 'text_y']]

output

   a  b    c    d text_x text_y
0  1  4  101  201  val_1  val_4
1  2  5  105  202  val_2  val_5
2  3  6  107  203  val_3  val_6

【讨论】:

    【解决方案3】:

    您想要的是 Pandas 的合并功能。假设您已经导入了带有 import pandas as pd 等简写名称的 Pandas 模块,那么:

    csv1_with_text_col = pd.merge(csv1, csv2, left_on='c', right_on='number', how='left')
    

    这将为您提供一个新的数据框 csv1_with_text_col,其中 csv2 中的列合并到 csv1 中,其中 csv1['c'] == csv2['number']。此外,通过指定how='left',将仅保留左侧数据帧 csv1 中的行。

    然后您可以将这个新数据框 csv1_with_text_col 再次与 csv2 合并,但与 left_on='d' 合并。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2012-01-14
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多