繁体   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