假设两个DataFrames
具有相等的列但不同的行,即使示例长度相等。我能够找到两个DataFrame的共性。我想利用这种相似性对其中一个DataFrame执行计算,并将结果放入另一个DataFrame中。总之,我想更新的耐克产品的销售价格是10%高于阿迪达斯产品的约束,他们都在同一类别和大小。
percent = 1.10
data1 = {
'item_id': [1001, 1002, 1003, 1004],
'brand': ['Adidas', 'Adidas', 'Adidas', 'Adidas'],
'category_id': [241, 241, 238, 717],
'size': [8, 7.5, 9, 10],
'cost_price': [8.02, 4.94, 1.49, 18.44],
'unit_price': [12.89, 7.98, 2.44, 29.53]
}
data2 = {
'item_id': [1005, 1006, 1007, 1008],
'brand': ['Nike', 'Nike', 'Nike', 'Nike'],
'category_id': [512, 241, 604, 717],
'size': [7.5, 8, 9, 10],
'cost_price': [35.90, 11.62, 15.03, 20.53],
'unit_price': [48.14, 16.29, 21.09, 28.20]
}
adidas = pd.DataFrame(data1)
nike = pd.DataFrame(data2)
columns = ['category_id', 'size']
common = adidas [columns].merge(nike[columns])
common
category_id size
0 241 8.0
1 717 10.0
df = pd.concat([adidas, nike]).merge(common)
df
item_id brand category_id size cost_price unit_price
0 1001 Adidas 241 8.0 8.02 12.89
1 1006 Nike 241 8.0 11.62 16.29
2 1004 Adidas 717 10.0 18.44 29.53
3 1008 Nike 717 10.0 20.53 28.20
字符串
如果你是一本字典,我会说:
cat_match = []
for catid in data2['category_id']:
try:
index = data1['category_id'].index(catid)
cat_match.append(index)
except ValueError:
pass
size_match = []
for size in data2['size']:
try:
index = data1['size'].index(size)
size_match(index)
except ValueError:
pass
print(cat_match)
[0, 3]
print(size_match)
[1, 0, 2, 3]
型
然后,我将计算data1
的“unit_cost”(又名销售价格),方法是在索引0和3处设置标记= unit_cost * percentage。接下来,我将在data2
中搜索相同的索引,并创建一个名为“new_sell”的新行,其中包含计算出的标记,该标记将添加到data2字典中。
我也尝试了下面的代码从另一个SO答案,但我收到了一个错误。
df2['new_sell'] = df2.apply(lambda row: row['unit_price'] * 1.10 if row['category_id'] == df1['category_id'] and row['size'] == df1['size'] else None, axis=1)
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
型
这两种尝试都相当混乱和复杂。有没有更简单的方法来实现以下使用pandas?
df2
item_id brand category_id size cost_price unit_price sell_price
0 1006 Nike 241 8.0 11.62 16.29 14.18 # (12.89*1.1)
1 1008 Nike 717 10.0 20.53 28.20 32.48 # (29.53*1.1)
型
2条答案
按热度按时间8tntrjer1#
使用左-
merge
并乘以1.1(例如eval
):字符串
如果你不想修改
nike
,而是想要一个新的DataFrame:型
输出量:
型
3ks5zfa02#
在这种情况下,我会使用多索引,这样你就可以循环使用类别/大小组合。这是我的解决方案:
字符串
输出如下所示:
型
如果你只想以同样的方式开始你可以做的耐克运动鞋:
型
其产生:
型