如何使用文件.DataFrame.assign()根据不同的datafram添加新列

2024-09-26 04:59:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧。你知道吗

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' objects are mutable, thus they cannot be hashed

我进行了测试,以确保我的df1.assign()是正确的

df1.assign(path = lambda x: x.filename)

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

我假设问题区域是“contains(x.filename+”.csv“)作为“Series”。如果我把它改成x。filename.values文件名然后我得到

{TypeError}unhashable type: 'numpy.ndarray'. I don't understand what "x" is. I assume its a Series object, but no idea how to tell which "row" its associated with if it is.

我可以强行这样做,只是在df1上循环,但df1是2M+的记录和循环似乎普遍不赞成对熊猫性能的原因。有人能指出我做错了什么吗?你知道吗


Tags: csvpathlambdadatafilenametmpseriesdf1
1条回答
网友
1楼 · 发布于 2024-09-26 04:59:28

IIUC,我想您应该使用str accessor和extract以及regex从路径中提取文件名并合并文件名:

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

相关问题 更多 >