![](/img/trans.png)
[英]Pandas compare 1 columns values to another dataframe column, find matching rows
[英]Pandas: Mapping values between 2 dataframes by matching 2 columns values (composite key) to 1 column and the column labels/index of another dataframe
問題聽起來之前已經被問過,但無法應用或理解我的案例的解決方案,因此問......
我有一個 dataframe Main
,看起來像這樣,有兩列topic, cat
有我想要的新需要的列Value
:
topic | cat | Value(needed col)
---------------------------------
top1 | cat1 | 0
---------------------------------
top2 | cat3 | 4
---------------------------------
top4 | cat4 | 1
雖然上面Value
col 的值在另一個 dataframe Values_df
中,其中一些 80Rx30C 的形式為:
cat | top1 | top2 | top3 | top4...top30
-------------------------------------------
cat1 | 0 | 1 | 2 | 2
-------------------------------------------
cat2 | 1 | 1 | 1 | 1
-------------------------------------------
cat3 | 2 | 4 | 3 | 3
-------------------------------------------
cat4 | 5 | 2 | 1 | 1
.
.
cat80 | 2 | 7 | 4 |
我嘗試轉置Values_df
並離開加入但無法弄清楚,因為我有多個列,我所做的另一種嘗試是在字典中創建一個字典,如下所示: {'cat1': {'top1':0, 'top2':1, 'top3':2, 'top4':2}}
和 map 但堅持映射它。
有什么方法可以幫助我在Main
中添加Value
col 嗎?
您可以通過 .melt() 熔化Values_df
來從Values_df
進行映射,然后通過.set_index()
.melt()
在列topic
和cat
上設置索引並指定列value
(列value
由.melt()
生成)
然后,在Main
dataframe 上,獲取每行topic
和cat
的元組作為組合鍵,用於匹配.map()
創建的映射,如下所示:
mapping = Values_df.melt(id_vars='cat', var_name='topic').set_index(['topic', 'cat'])['value']
Main['Value'] = Main[['topic', 'cat']].apply(tuple, axis=1).map(mapping)
數據輸入
Main = pd.DataFrame({'topic': ['top1', 'top2', 'top4'], 'cat': ['cat1', 'cat3', 'cat4']})
topic cat
0 top1 cat1
1 top2 cat3
2 top4 cat4
data = {'cat': ['cat1', 'cat2', 'cat3', 'cat4', 'cat80'],
'top1': [0, 1, 2, 5, 2],
'top2': [1, 1, 4, 2, 7],
'top3': [2, 1, 3, 1, 4],
'top4': [2, 1, 3, 1, 9]}
Values_df = pd.DataFrame(data)
cat top1 top2 top3 top4
0 cat1 0 1 2 2
1 cat2 1 1 1 1
2 cat3 2 4 3 3
3 cat4 5 2 1 1
4 cat80 2 7 4 9
映射創建:
print(mapping)
topic cat
top1 cat1 0
cat2 1
cat3 2
cat4 5
cat80 2
top2 cat1 1
cat2 1
cat3 4
cat4 2
cat80 7
top3 cat1 2
cat2 1
cat3 3
cat4 1
cat80 4
top4 cat1 2
cat2 1
cat3 3
cat4 1
cat80 9
Name: value, dtype: int64
結果:
print(Main)
topic cat Value
0 top1 cat1 0
1 top2 cat3 4
2 top4 cat4 1
像下面這樣的東西?
import pandas as pd
#dummy main data
main_df = pd.DataFrame({
'topic': ['top1', 'top2', 'top4'],
'cat': ['cat1', 'cat3', 'cat4'],
})
#dummy values data
values_df = pd.DataFrame({
'cat': ['cat1', 'cat2', 'cat3', 'cat4', 'cat5', 'cat6'],
'top1': [10, 1, 2, 3, 4, 5],
'top2': [5, 4, 3, 2, 1, 6],
'top3': [2, 2, 1, 3, 5, 3],
'top4': [3, 4, 1, 2, 3, 6],
'top5': [1, 3, 2, 5, 4, 7],
})
melt
values_df
,但在此之前,我們需要為 values_df 快速創建列values_df
:
cols_label = ['top' + str(x) for x in range(1, 6)]
在您的情況下, range(1, 6)
應該是range(1, 31)
。
融化values_df
:
values_df = values_df.melt(id_vars=['cat'], value_vars=cols_label)
這將為我們提供以下內容:
然后,合並 main_df 和 values_df:
merged = main_df.merge(values_df, how='left', left_on=['cat', 'topic'], right_on=['cat', 'variable']).drop('variable', axis=1)
這是最終結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.