Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在非唯一但有条件选择非唯一值(技术上是唯一的)的列上合并2个数据帧_Python_Pandas_Dataframe_Merge - Fatal编程技术网

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'])