编辑:让我复制整个数据集
df是商店销售/库存数据
branch daqu store store_name style color size stocked sold in_stock balance
0 huadong wenning C301 EE #��#��##�� EEBW52301M 39 160 7 4 3 -5
1 huadong wenning C301 EE #��#��##�� EEBW52301M 39 165 1 0 1 1
2 huadong wenning C301 EE #��#��##�� EEBW52301M 39 170 6 3 3 -3
dh是交易(将'金额'从商店'移动'从'转移到'')
branch daqu from to style color size amount box_sum
8 huadong shanghai C306 C30C EEOM52301M 59 160 1 162
18 huadong shanghai C306 C30C EEOM52301M 39 160 1 162
25 huadong shanghai C306 C30C EETJ52301M 52 160 9 162
26 huadong shanghai C306 C30C EETJ52301M 52 155 1 162
32 huadong shanghai C306 C30C EEOW52352M 19 160 2 162
我想要的是交易后的商店库存数据,它看起来与df格式完全相同,但只有'in_stock'数字会根据dh中的数字从原来的df改变。
以下是我的尝试:
df['full_code'] = df['store']+df['style']+df['color'].astype(str)+df['size'].astype(str)
dh['from_code'] = dh['from']+dh['style']+dh['color'].astype(str)+dh['size'].astype(str)
dh['to_code'] = dh['to']+dh['style']+dh['color'].astype(str)+dh['size'].astype(str)
# subtract from 'from' store
dh_from = pd.DataFrame(dh.groupby('from_code')['amount'].sum())
for code, stock in dh_from.iterrows() :
df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] - stock
# add to 'to' store
dh_to = pd.DataFrame(dh.groupby('to_code')['amount'].sum())
for code, stock in dh_to.iterrows() :
df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] + stock
df.to_csv('d:/after_dh.csv')
但是当我打开csv文件时,那些发生交易的'in_stock'值都是空白。
我认为df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] + stock
这有一些问题。更新价值的正确方法是什么?
ORIGINAL:我有两个pandas数据帧:df1用于库存,df2用于交易
df1看起来像这样:
full_code in_stock
1 AAA 200
2 BBB 150
3 CCC 150
df2看起来像这样:
from to full_code amount
1 XX XY AAA 30
2 XX XZ AAA 35
3 ZY OI BBB 50
4 AQ TR AAA 15
我想要的是所有交易完成后的库存。 在这种情况下,
full_code in_stock
1 AAA 120
2 BBB 100
3 CCC 150
请注意,full_code在df1中是唯一的,但在df2中不是唯一的。 有没有熊猫这样做的方法?我搞砸了原始数据帧和数据帧的视图,并通过将它们变成numpy数组并找到匹配的full_codes来解决它。但是结果代码也是一团糟,并且想知道是否有一种更简单的方法可以做到这一点而不是把所有东西变成一个numpy数组。
答案 0 :(得分:1)
我要做的是将df1
中的索引设置为'full_code'列,然后调用sub
减去其他df。
我们传递的值是“full_code”分组并在“金额”列上调用sum
的结果。
sub
的另一个参数是fill_values
这是因为rhs上不存在产品'CCC'所以我们希望保留此值,否则它会变为NaN
:< / p>
In [25]:
total = df1.set_index('full_code')['in_stock'].sub(df2.groupby('full_code')['amount'].sum(), fill_value=0)
total.reset_index()
Out[25]:
full_code in_stock
0 AAA 120
1 BBB 100
2 CCC 150