我有兩個資料框和一個相當棘手的連接來完成。
第一個資料框:
data = [[0, 'Standard1', [100, 101, 102]], [1, 'Standard2', [100, 102]], [2, 'Standard3', [103]]]
df1 = pd.DataFrame(data, columns = ['RuleSetID', 'RuleSetName', 'KeyWordGroupID'])
df1
Output:
RuleSetID RuleSetName KeyWordGroupID
0 Standard1 [100, 101, 102]
1 Standard2 [100, 102]
2 Standard3 [103]
... ... ...
第二個:
data = [[100, 'verahren', ['word1', 'word2']],
[101, 'flaechen', ['word3']],
[102, 'nutzung', ['word4', 'word5']],
[103, 'ort', ['word6', 'word7']]]
df2 = pd.DataFrame(data, columns = ['KeyWordGroupID', 'KeyWordGroupName', 'KeyWords'])
df2
Output:
KeyWordGroupID KeyWordGroupName KeyWords
100 verahren ['word1', 'word2']
101 flaechen ['word3']
102 nutzung ['word4', 'word5']
103 ort ['word6', 'word7']
... ... ...
所需的輸出:
RuleSetID RuleSetName KeyWordGroupID
0 Standard1 [['word1', 'word2'], ['word3'], ['word4', 'word5']]
1 Standard2 [['word1', 'word2'], ['word4', 'word5']]
2 Standard3 [['word6', 'word7']]
我嘗試使用將第二個資料幀轉換為字典df.to_dict('records')并將其放入 pandas 應用用戶定義的函式以通過鍵值進行匹配,但這似乎不是一種干凈的方法。
有人有辦法解決這個問題嗎?任何想法都會得到回報。
uj5u.com熱心網友回復:
我認為你有幾個不同的選擇
- 您可以創建字典并使用
map - 您可以將串列轉換為字串并使用
replace
選項1
e = df1.explode('KeyWordGroupID') # explode youre frame
# create a dictionary from KeyWords and map it to the KeyWordGroupID
e['KeyWords'] = e['KeyWordGroupID'].map(df2.set_index('KeyWordGroupID')['KeyWords'].to_dict())
# merge df1 with e
new_df = df1.merge(e.groupby('RuleSetID')['KeyWords'].agg(list), right_index=True, left_on='RuleSetID')
RuleSetID RuleSetName KeyWordGroupID \
0 0 Standard1 [100, 101, 102]
1 1 Standard2 [100, 102]
2 2 Standard3 [103]
KeyWords
0 [[word1, word2], [word3], [word4, word5]]
1 [[word1, word2], [word4, word5]]
2 [[word6, word7]]
uj5u.com熱心網友回復:
@Corralien 對 pandas 有一個很好的答案來解決這個問題。但在這里,我想介紹一種更簡潔的方法datar,即對 pandas API 的重新想象:
>>> from datar.all import f, unchop, left_join, group_by, summarise
>>>
>>> (
... df1
... >> unchop(f.KeyWordGroupID) # Make KeyWordGroupID one at a row
... >> left_join(df2, by=f.KeyWordGroupID) # Attach df2 by KeyWordGroupIDs
... >> group_by(f.RuleSetID, f.RuleSetName)
... >> summarise(KeyWords = f.KeyWords.agg(pd.Series)) # Concatenate the KeyWords
... )
[2022-03-28 13:52:38][datar][ INFO] `summarise()` has grouped output by ['RuleSetID'] (override with `_groups` argument)
RuleSetID RuleSetName KeyWords
<int64> <object> <object>
0 0 Standard1 [[word1, word2], [word3], [word4, word5]]
1 1 Standard2 [[word1, word2], [word4, word5]]
2 2 Standard3 [word6, word7]
[TibbleGrouped: RuleSetID (n=3)]
與熊貓本身相同的想法:
(
df1
.explode("KeyWordGroupID")
.merge(df2, how="left", on="KeyWordGroupID")
.groupby(["RuleSetID", "RuleSetName"])
.agg({"KeyWords": pd.Series})
.reset_index()
)
uj5u.com熱心網友回復:
主要思想是轉換df2為字典映射Series,其中key是KeyWordGroupID列,而value是KeyWords列。
您可以使用將它的列explode展平到然后重塑您的第一個資料框:KeyWordGroupIDdf1mapdf2groupby
df1['KeyWordGroupID'] = (
df1['KeyWordGroupID'].explode().map(df2.set_index('KeyWordGroupID')['KeyWords'])
.groupby(level=0).apply(list)
)
print(df1)
# Output
RuleSetID RuleSetName KeyWordGroupID
0 0 Standard1 [[word1, word2], [word3], [word4, word5]]
1 1 Standard2 [[word1, word2], [word4, word5]]
2 2 Standard3 [[word6, word7]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/451337.html
上一篇:如何從Snowflake的另一個表中選擇不在表中的所有內容?
下一篇:外部連接表-保留描述
