我有两个数据框。
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似乎通常不赞成使用循环。有人能指出我做错了吗?
答案 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