我有两个csv文件
csv1:
csv2:
我需要处理的是:
获取csv1文件的列 c 的每个值,并将其与csv2的列 number 相匹配。
如果csv2的任何行与该数字匹配,则在csv1中添加新列 c_text ,其中将包含与csv2的行匹配的 text 列的值
对csv1的列 d 重复上述过程,并将新列 d_text 添加到csv1
这是我最后需要的
是熊猫的新手。我如何使用熊猫来做到这一点。
答案 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'
合并。