根据列值

时间:2015-05-27 17:34:16

标签: python pandas

编辑:让我复制整个数据集

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数组。

1 个答案:

答案 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