Python 如何对两个数据帧求和并删除旧值
我有两个数据帧,我需要在一个键上连接,并在删除原始值(或者可能创建一个新的df)的同时对另一个键的值求和 第一个包含几个元素的数据帧如下所示Python 如何对两个数据帧求和并删除旧值,python,pandas,numpy,dataframe,python-3.7,Python,Pandas,Numpy,Dataframe,Python 3.7,我有两个数据帧,我需要在一个键上连接,并在删除原始值(或者可能创建一个新的df)的同时对另一个键的值求和 第一个包含几个元素的数据帧如下所示 product_id 123123123123 title Maroon/Pink / 6 price 26.00
product_id 123123123123
title Maroon/Pink / 6
price 26.00
sku 111111/PINK-6
barcode 121212221
inventory_item_id 256256256
product_id 123123123123
title Maroon/Pink / 2
price 26.00
sku 111111/PINK-2
barcode 121212222
inventory_item_id 256256257
product_id 123123123123
title Maroon/Pink / 8
price 26.00
sku 111111/PINK-8
barcode 121212223
inventory_item_id 256256258
第二个看起来像
inventory_item_id 256256256
location_id 2626262626
available 3
inventory_item_id 256256257
location_id 2626262626
available 2
inventory_item_id 256256258
location_id 2626262626
available 7
inventory_item_id 256256258
location_id 2626262623
available 2
inventory_item_id 256256257
location_id 2626262623
available 2
inventory_item_id 256256258
location_id 2626262629
available 2
这两个DF都有其他的列,我在这里没有包括这些列,但是我希望在最终输出中包含这些列。所以我想要一个最终的输出和可用值的总和
product_id 123123123123
title Maroon/Pink / 6
price 26.00
sku 111111/PINK-6
barcode 121212221
inventory_item_id 256256256
available 3
product_id 123123123123
title Maroon/Pink / 2
price 26.00
sku 111111/PINK-2
barcode 121212222
inventory_item_id 256256257
available 4
product_id 123123123123
title Maroon/Pink / 8
price 26.00
sku 111111/PINK-8
barcode 121212223
inventory_item_id 256256258
available 11
而且不是立即,必要的,但最终希望能够通过位置id过滤这些
非常感谢 与SQL的内部联接类似,我查看了一下,得出了我的答案
merged_df = pd.merge(left=df1, right=df2,
left_on='inventory_item_id',
right_on='inventory_item_id')
很长,希望有人能提供一个更简短的版本。 我复制了您的文本并创建了两个文本文件,每个数据帧一个
#inventory.txt
0
0 product_id 123123123123 ...
1 title Maroon/Pink / 6 ...
2 price 26.00 ...
3 sku 111111/PINK-6 ...
4 barcode 121212221
5 inventory_item_id 256256256
6 product_id 123123123123 ...
7 title Maroon/Pink / 2 ...
8 price 26.00 ...
9 sku 111111/PINK-2 ...
10 barcode 121212222
11 inventory_item_id 256256257
12 product_id 123123123123 ...
13 title Maroon/Pink / 8 ...
14 price 26.00 ...
15 sku 111111/PINK-8 ...
16 barcode 121212223
17 inventory_item_id 256256258
import pandas as pd
import numpy as np
#first dataframe and some cleanup
m = (pd.read_csv('inventory.txt', header=None)
[0]
.str.strip()
.str.split(n=1,expand=True)
.pivot(columns=0,values=1)
.fillna(method='ffill')
.dropna()
.drop_duplicates('inventory_item_id')
.set_index('inventory_item_id')
)
m
inventory_item_id product_id title price sku barcode
256256256 123123123123 Maroon/Pink / 6 26.00 111111/PINK-6 121212221
256256257 123123123123 Maroon/Pink / 2 26.00 111111/PINK-2 121212222
256256258 123123123123 Maroon/Pink / 8 26.00 111111/PINK-8 121212223
第二数据帧
#inventory1.txt
0
0 inventory_item_id 256256256 ...
1 location_id 2626262626 ...
2 available 3 ...
3 inventory_item_id 256256257 ...
4 location_id 2626262626 ...
5 available 2 ...
6 inventory_item_id 256256258 ...
7 location_id 2626262626 ...
8 available 7 ...
9 inventory_item_id 256256258 ...
10 location_id 2626262623 ...
11 available 2
12 inventory_item_id 256256257 ...
13 location_id 2626262623 ...
14 available 2
15 inventory_item_id 256256258 ...
16 location_id 2626262629 ...
17 available 2
清除第二个数据帧
n = (pd.read_csv('inventory1.txt',header=None)
[0]
.str.strip()
.str.split(n=1,expand=True)
.pivot(columns=0,values=1)
.fillna(method='ffill')
.dropna()
.drop_duplicates('available')
.set_index('inventory_item_id')
.assign(available = lambda x: x.available.astype('int64'))
)
n
inventory_item_id location_id available
256256256 2626262626 3
256256257 2626262626 2
256256258 2626262626 7
下一步是连接两个数据帧,
创建一个新列,对可用列值进行累积求和
最后将标题翻转(转置)到行
p = (m.join(n,how='left')
.assign(available = lambda x : x.available.cumsum())
.reset_index()
.transpose())
p
0 1 2
inventory_item_id 256256256 256256257 256256258
product_id 123123123123 123123123123 123123123123
title Maroon/Pink / 6 Maroon/Pink / 2 Maroon/Pink / 8
price 26.00 26.00 26.00
sku 111111/PINK-6 111111/PINK-2 111111/PINK-8
barcode 121212221 121212222 121212223
location_id 2626262626 2626262626 2626262626
available 3 5 12
最后一步,让它看起来像你的问题:
(pd.concat([p[0],p[1],p[2]],
axis=0))
inventory_item_id 256256256
product_id 123123123123
title Maroon/Pink / 6
price 26.00
sku 111111/PINK-6
barcode 121212221
location_id 2626262626
available 3
inventory_item_id 256256257
product_id 123123123123
title Maroon/Pink / 2
price 26.00
sku 111111/PINK-2
barcode 121212222
location_id 2626262626
available 5
inventory_item_id 256256258
product_id 123123123123
title Maroon/Pink / 8
price 26.00
sku 111111/PINK-8
barcode 121212223
location_id 2626262626
available 12
dtype: object
elcapitan,你能给我们一个dict,比如print(df[0:3].to_dict())的输出,这样我们就可以轻松地创建数据帧了吗?谢谢!是的,等一下!只需稍微清理一下数据,就可以使用它了。有成千上万的条目,所以我想确保我得到了一些具有一致id的条目。这是enoguh数据。你能以更清晰、更易于使用的格式共享这些数据吗?CSV是好的,
.to_dict()
的输出也是好的。这似乎不起作用。它只是合并两个数据帧,但不求和可用值或删除旧值。因此,有大量记录具有相同的库存项目id
,而不是每个id只有一个库存项目id行。这越来越近了,但对某些值有多个引用,即有三个可用列,一个有3、5和12。我不确定是哪一个accurate@elcapitan,在您的问题中,u表示您希望对可用数据进行汇总,并展示了一个示例数据框,其中每个库存项目的累计和用于相同的产品id。我的回答反映了这一点,并将最终数据框连接在一起。如果这不是你想要的,那么请举例说明