我有以下csv文件:
file1.csv #dataframe is named dfFile1
Id,name,pos_neg,line
1,abc,pos,cas
2,cde,neg,work
3,efg,pos,cat
4,abc,pos,job
file2.csv #dataframe is named dfFile2
Id,ref,names,other
c10,n1,www,10.5
c11,m4,efg,5.4
c12,m5,cde,9.8
c13,m9,hhh,6.7
c14,n4,abc,12.5
c15,n9,kkk,3.4
我使用熊猫将其转换为数据帧。我想根据dfFile1的 name 字段中显示的唯一值获取与dfFile2的行匹配的第三个数据框,并从文件中添加 pos_neg 行1,所以我最终得到:
dfNew
Id,ref,names,other,pos_neg
c11,m4,efg,5.4,pos
c12,m5,cde,9.8,neg
c14,n4,abc,12.5,pos
到目前为止,我已经完成了以下操作:
list=[]
list=dfFile1["name"].unique() #contains [abc,cde,efg]
dfFile2=dfFile2[dfFile2.names.isin(list)]
但是我只是不知道如何合并dfFile1中的列 pos_neg ,我尝试了以下操作:
dfNew=dfFile2.merge(dfFile2,dfFil1[["pos_neg"]],on=dfFile2)
,但不起作用。
有帮助吗?
谢谢
答案 0 :(得分:1)
您快到了,只是通过DataFrame.merge
方法进行了一些调整,此外,您还需要drop_duplicates
,因为abc
在dfFile1
中出现了两次。
dfNew = (
dfFile2.merge(dfFile1[['name', 'pos_neg']],
left_on='names',
right_on='name')
.drop_duplicates()
.drop(columns='name')
)
Id ref names other pos_neg
0 c11 m4 efg 5.4 pos
1 c12 m5 cde 9.8 neg
2 c14 n4 abc 12.5 pos
旁注:在Python中,变量名不使用camelCase
,而下划线camel_case
小写。参见PEP8 style guide
:
函数名称应小写,必要时用下划线分隔单词,以提高可读性。
答案 1 :(得分:1)
您可以遍历数据框
df3 = df2[df2.names.isin(names)]
for index, row in df3.iterrows():
row = df[row['names'] == df['name']]['pos_neg']
df3.loc[index,'pos_neg'] = row.iloc[0]
row.loc [0]代表具有相同“名称”字段的行。首先获取相同名称的行
答案 2 :(得分:0)
尝试:
dfNew = dfFile2.merge(dfFile1[["name", "pos_neg"]], how="inner", left_on="names", right_on="name")
如果上述方法可行,重新排列列和/或重命名它们并不难。