![](/img/trans.png)
[英]Merging pandas dataframes with different size on column with non-unique elements
[英]Merging 2 pandas dataframes on a column that is non unique but has conditions on selecting the non-unique values (technically then unique)
假設我有 2 個數據df1
和df2
。
import pandas as pd
df1 = pd.DataFrame({'weight': [1,2,3,4], 'weight_units': ['lb','oz','oz', 'lb']})
df2 = pd.DataFrame({'weight': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8], 'price':[1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3]})
第一個 dataframe ( df1
) 包含 object 的重量以及該重量的測量單位oz
& lb
(盎司、磅)
第二個 dataframe ( df2
) 包含一個具有重量值(以磅和盎司為單位)和相關價格值的列。 在值達到 16(盎司)后的重量列中,它從 1 重新開始並上升 (1,2,3,4),表示其現在的磅數。
注:1lb = 16oz
我的問題是:如何在權重列上合並這兩個數據幀,以便如果 package 的單位為oz
,我使用df2
中的前 16 個值開始合並,如果它以lb
為單位,我在第二個 dataframe 上開始合並從第 17 個值開始? 或任何其他正確執行此合並並獲得正確 output 的合理方式(如果它的單位為lb
或oz
)
想法:我主要擔心的是,由於重量列在技術上不是唯一的(因為數字 1-16 重復磅和盎司)你不能簡單地合並,好像 package 的重量為 1,除非我可以使用它不會使用的單位條件知道采取哪個價格價值。
理想的 Output:一個 dataframe 已正確合並,如果其lb
或oz
(磅或盎司)取正確的值
df3 = pd.DataFrame({'weight': [1,2,3,4], 'weight_units': ['lb','oz','oz', 'lb'], 'price':[2.7, 1.1,1.2,2]})
一個想法是創建新列,例如:
df2['weight_units'] = ['oz'] * 16 + ['lb'] * (len(df2) - 16)
或者:
df2['weight_units'] = df2['weight'].eq(1).cumsum().map({1:'oz', 2:'lb'})
然后由df1
合並:
df = df1.merge(df2, on=['weight','weight_units'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.