我有一个具有以下设置的csv文件:
col0 col1 col2 col3 col4
0 A 12 22 23
1 B 40 59 63
2 F 76 81 99
3 J 10 11 12
4 A 20 15 43
df = pd.read_csv('foo.csv,dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
# col0 represents pandas default indexing
# This dataframe contains 230 rows
我还有另一个具有以下设置的csv文件:
col0 colx coly colz colz1
0 A 12 211 313
1 J 44 222 134
2 A 33 344 277
3 B 456 344 333
df2 = pd.read_csv('foo2.csv,dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
# I have 14 rows in this dataframe.
目标是检查col1是否与colx匹配,然后我希望代码将coly,colz,colz1附加到第一个数据帧。例如,
col0 col1 col2 col3 col4 col5 col6 col7
0 A 12 22 23 12 211 313
1 B 40 59 63
2 F 76 81 99
3 J 10 11 12 44 222 134
4 A 20 15 43
# I have left some rows blank just to highlight 'A' and 'J'.
这是我能想到的更合理的解决方案之一。
def add_multiple_columns(x):
df2 = pd.read_csv('foo2.csv', dtype='object', sep=r'\s*,\s*', engine='python')
df2 = df2.apply(lambda y: y['coly', 'colz', 'colz1'] if x['col1'] == y['colx'] else None, axis=1)
df2 = df2.dropna(axis=0, how='all')
if df2.empty:
df2 = 0
else:
df2 = df2.to_string(index=False)
return df2
df['col5', 'col6', 'col7'] = df.apply(add_multiple_columns, axis=1)
这段代码会导致混乱的回溯,我什至不确定是否要发布整个内容。我唯一了解的是存在一个* type错误,'str'对象无法解释为整数和 KeyError:('(''col1','发生在索引0','发生在索引0 ')
请记住,我在两个数据帧中没有相等数量的行,因此,在多个实例中,第一个数据帧中的行需要从第二个数据帧中追加相同数量的行。我该如何工作?
答案 0 :(得分:0)
我看到df2 colx中有多行是A,并且您将第一行与A匹配,因此我删除了重复项并保留了第一个值。这会进行左合并,这将为您提供所需的行为。我在您的输出中注意到您在B上不匹配,应该在B上匹配,对吧?
df = pd.read_csv('foo.csv',dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
df2 = pd.read_csv('foo2.csv',dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
temp = df2[['colx', 'coly', 'colz', 'colz1']] # this drops col0
temp = temp.drop_duplicates(subset='colx', keep='first') # This is to drop duplicate values for colx
df3 = df.merge(temp,on_left='col1', on_right='colx', how='left')
df3 = df3.rename(columns = {'coly':'col5', 'colz':'col6', 'colz1':'col7'})