Pandas基于多列/行标准添加不同行

2021-05-13 14:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一家杂货店,每天都有一份每种水果的库存清单。我需要更新每日库存从一个数据框每天损坏总数。如何取2018年8月31日的期末存货,再加上2018年9月1日晚上的变质物,得到2018年9月1日的期初存货。在

我每天的水果销售都是这样的。在

Fruit CurrentDate  DailyFruitSpoilage
0  Apple   2018-08-29  -10
1  Apple   2018-08-30  -20
2  Apple   2018-08-31  -30
3  Apple   2018-09-01  -40
4  Orange  2018-08-29  -10
5  Orange  2018-08-30  -20
6  Orange  2018-08-31  -30
7  Orange  2018-09-01  -40

我的库存表如下:

^{pr2}$

因此,为了获得2018年9月1日的橙色库存,我想从8月31日(750)开始计算我的橘子库存,并将2018年9月1日晚上的坏橘子(-40)加在一起,这样当我在2018年9月1日开始一天的时候,我的橙色库存开始为710个。每日库存和每日水果腐败来自一个数据库,我试图计算开始水果库存。在

我的第一个想法是基于水果和日期进行合并,但是通过这样做,行在过去被1抵消。如果有道理的话。在

8/30's DailyEndingInventory + 8/31's DailyFruitSpoilage = 8/31's BeginningFruitInventory

简而言之,当我需要的数据在不同的行上时,如何添加列?在

2条回答
网友
1楼 ·

我们可以使用numpy数组进行切片和添加。假设df是变质表,df2是库存表,1050是水果的初始数量

dfj=df.join(df2.set_index(['CurrentDate','Fruit']),on=['CurrentDate','Fruit'],how='outer')
dfj=dfj.sort_values(['Fruit','CurrentDate']).reset_index(None,True)
dfj.loc[1:,'BeginningFruitInventory']=np.array(dfj.DailyEndingInventory[:-1])+np.array(dfj.DailyFruitSpoilage[1:])
dfj.BeginningFruitInventory.fillna(1050,inplace=True)
dfj
^{pr2}$
  • 连接CurrentDate和fruit上的两个数据帧
  • 排序和重置索引
  • 使用np.数组()添加每个系列的切片而不考虑索引
  • 或者,也可以在切片后重置索引并正常添加它们。在
网友
2楼 ·

根据你的数据:

data_1 = {'Fruit': ['Apple', 'Apple', 'Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Orange'],
        'CurrentDate': ['2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01', '2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01'],
        'DailyFruitSpoilage': [-10, -20, -30, -40, -10, -20, -30, -40]}

data_2 = {'Fruit': ['Apple', 'Apple', 'Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Orange'],
        'CurrentDate': ['2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01', '2018-08-29', '2018-08-30', '2018-08-31', '2018-09-01'],
        'DailyEndingInventory': [1000, 900, 870, 820, 1000, 900, 820, 750]}

df_1 = pd.DataFrame(data_1)
df_2 = pd.DataFrame(data_2)

相应地转换日期并创建日期偏移:

^{pr2}$

然后合并带有滞后的数据帧:

df_3 = df_1.merge(df_2, on=['Date','Fruit'], suffixes=('','_lag'), how='right')

计算列差异,然后相应地移动:

df_3['BeginningInventory'] = df_3['DailyFruitSpoilage'] + df_3['DailyEndingInventory']

df_3.BeginningInventory = df_3.BeginningInventory.shift(+1)

然后返回一个BeginningInventory列:

Index   Fruit CurrentDate  DailyFruitSpoilage       Date CurrentDate_lag  DailyEndingInventory  BeginningInventory
0   Apple  2018-08-30               -20.0 2018-08-30      2018-08-29                  1000                 NaN
1   Apple  2018-08-31               -30.0 2018-08-31      2018-08-30                   900               980.0
2   Apple  2018-09-01               -40.0 2018-09-01      2018-08-31                   870               870.0
3  Orange  2018-08-30               -20.0 2018-08-30      2018-08-29                  1000               830.0
4  Orange  2018-08-31               -30.0 2018-08-31      2018-08-30                   900               980.0
5  Orange  2018-09-01               -40.0 2018-09-01      2018-08-31                   820               870.0
6   Apple         NaT                 NaN 2018-09-02      2018-09-01                   820               780.0
7  Orange         NaT                 NaN 2018-09-02      2018-09-01                   750                 NaN

相关问题