如何使用pandas.DataFrame.assign()根据不同的数据框添加新列

时间:2018-01-17 04:49:16

标签: python pandas numpy

我有两个数据框。

DF1:

filename|data
fileA|1
fileB|33
fileC|343

DF2:

path|filesize|filetype
/tmp/fileA.csv|123|csv
/tmp/fileB.csv|123|csv
/tmp/fileC.csv|3534|csv
/tmp/fileD.csv|234|csv

我希望结果是

filename|data|path
fileA|1|/tmp/fileA.csv
fileB|33|/tmp/fileB.csv
fileC|343|/tmp/fileC.csv
fileD|3243|/tmp/fileD.csv

这似乎非常简单,但我似乎无法使用.assign()。我需要将df1.filename中的每一行与df2.filepath中的内容进行匹配,然后将df1 ['filepath']添加到df1。

我尝试了以下内容,但它抱怨说系列不是“可以播放”

df1.assign(path = lambda x: df2[df2.path.str.contains(x.filename + ".csv")][path])
  

{TypeError}'Series'对象是可变的,因此它们不能被散列

我通过

测试确保我的df1.assign()是正确的
df1.assign(path = lambda x: x.filename)

它工作,只是在df1上附加了文件名(这是我所期望的)。

我假设问题区域是`contains( x.filename +“.csv”)是“系列”。如果我将其更改为x.filename.values,那么我得到

  

{TypeError}不可用类型:'numpy.ndarray'。我不明白“x”是什么。我假设它是一个Series对象,但不知道如何判断它与哪个“行”相关联。

我可以暴力破解这个并且只是循环遍历df1但是df1是2M +记录,并且出于性能原因,pandas似乎通常不赞成使用循环。有人能指出我做错了吗?

1 个答案:

答案 0 :(得分:0)

IIUC,我认为你想使用str accessor和extract一个正则表达式从路径中提取文件名并合并到文件名:

df2.assign(filename=df2.path.str.extract(r'(\w+)\.csv', expand=True))\
   .merge(df1, on='filename')

输出:

             path  filesize filetype filename  data
0  /tmp/fileA.csv       123      csv    fileA     1
1  /tmp/fileB.csv       123      csv    fileB    33
2  /tmp/fileC.csv      3534      csv    fileC   343