簡體   English   中英

Pandas:通過將 2 列值(復合鍵)匹配到 1 列和另一個 dataframe 的列標簽/索引來映射 2 個數據幀之間的值

[英]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()在列topiccat上設置索引並指定列value (列value.melt()生成)

然后,在Main dataframe 上,獲取每行topiccat的元組作為組合鍵,用於匹配.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM