![](/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.