根据其他csv的匹配值将两列添加到csv文件中

时间:2018-09-28 15:37:00

标签: python-3.x pandas

我有两个csv文件

csv1:

enter image description here

csv2:

enter image description here

我需要处理的是:

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

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

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

这是我最后需要的

enter image description here

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

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您想要的是Pandas的合并功能。假设您已经导入了Pandas模块,其简写名称为import pandas as pd,则:

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'合并。

相关问题