簡體   English   中英

合並 2 個 pandas 數據幀到一個非唯一但有條件選擇非唯一值的列上(技術上是唯一的)

[英]Merging 2 pandas dataframes on a column that is non unique but has conditions on selecting the non-unique values (technically then unique)

假設我有 2 個數據df1df2

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 的合理方式(如果它的單位為lboz

想法:我主要擔心的是,由於重量列在技術上不是唯一的(因為數字 1-16 重復磅和盎司)你不能簡單地合並,好像 package 的重量為 1,除非我可以使用它不會使用的單位條件知道采取哪個價格價值。

理想的 Output:一個 dataframe 已正確合並,如果其lboz (磅或盎司)取正確的值

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.

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