Python 在非唯一但有条件选择非唯一值(技术上是唯一的)的列上合并2个数据帧
假设我有两个数据帧Python 在非唯一但有条件选择非唯一值(技术上是唯一的)的列上合并2个数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,假设我有两个数据帧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
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]})
第一个数据帧(df1
)包含对象的重量以及该重量的测量单位oz
&lb
(盎司,磅)
第二个数据帧(df2
)包含一列,该列具有重量值(以磅和盎司为单位)和相关价格值。在“重量”列中,当值达到16(盎司)时,它重新开始为1,然后上升(1,2,3,4),表示其现在的磅数
注:1lb=16盎司
我的问题是:如何合并权重列上的这两个数据帧,以便如果包具有oz
单位,我使用df2
中的前16个值开始合并,如果其位于lb
中,我从第17个值开始在第二个数据帧上开始合并?或任何其他合理的方式来正确执行此合并,并在其处于lb
或oz
想法:
我主要担心的是,由于重量列在技术上不是唯一的(因为数字1-16在磅和盎司上重复),你不能简单地合并,就好像一个包裹的重量是1,除非我可以使用单位条件,否则它不知道取哪个价格值
理想输出:
已正确合并的数据帧,如果其lb
或oz
(磅或盎司),则采用正确的值
一个想法是创建新专栏,例如:
df2['weight_units'] = ['oz'] * 16 + ['lb'] * (len(df2) - 16)
或:
然后通过df1
合并:
df = df1.merge(df2, on=['weight','weight_units'])
非常感谢,你能解释一下你的第一句话吗?不完全确定如何编写像这样的
df2['weights_units']
。@nishcs-它的意思是手动
方式-换句话说-前16个值是oz
,所有其他值都是lb
啊好的,谢谢,从这个意义上说,第二个方法是“自动”
它为您执行映射的方式?@nishcs-您完全正确。
df2['weight_units'] = df2['weight'].eq(1).cumsum().map({1:'oz', 2:'lb'})
df = df1.merge(df2, on=['weight','weight_units'])