Python 如何对两个数据帧求和并删除旧值

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

我有两个数据帧,我需要在一个键上连接,并在删除原始值(或者可能创建一个新的df)的同时对另一个键的值求和

第一个包含几个元素的数据帧如下所示

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。我的回答反映了这一点,并将最终数据框连接在一起。如果这不是你想要的,那么请举例说明