[英]How to use pandas.DataFrame.assign() to add new column based on a different dataframe
我有兩個數據框。
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。
我嘗試了以下操作,但它抱怨Series不“可哈希化”
df1.assign(path = lambda x: df2[df2.path.str.contains(x.filename + ".csv")][path])
{TypeError}“系列”對象是可變的,因此不能進行散列
我通過執行以下操作來確保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 +記錄,出於性能原因,大熊貓似乎普遍不贊成循環。 有人可以指出我做錯了什么嗎?
IIUC,我想您想使用str訪問器並使用正則表達式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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.