Python 计算数据帧行中的买卖数量差异

Python 计算数据帧行中的买卖数量差异,python,pandas,group-by,Python,Pandas,Group By,我在下面的数据中所需的购买和出售存在项目差异 我当前的DF如下所示: Items Type Qty 0 myitem1 BUY 1546 1 myitem1 SELL 1340 2 myitem2 BUY 149 3 myitem2 SELL 130 4 myitem4 SELL 100 5 newitem BUY 1000 6 newitem SELL 1000 我希望期望的产量是买卖的差额。i

我在下面的数据中所需的购买和出售存在项目差异

我当前的DF如下所示:

    Items  Type   Qty 
0   myitem1   BUY  1546 
1   myitem1  SELL  1340 
2   myitem2  BUY   149 
3   myitem2  SELL   130 
4   myitem4   SELL   100 
5   newitem   BUY  1000 
6   newitem  SELL  1000 
我希望期望的产量是买卖的差额。i、 e.

    Items  Type   Qty 
   myitem1   BUY  206 
   myitem2  BUY   19 
   myitem4   SELL   100 
注意:对于某些项目,上面的行可能只有一个
购买
出售
,在这种情况下,它是针对项目4的

此外,输出不必包含相等的项(在本例中,以newitem为例)


我已经尝试了使用DF groupby等多种方法来实现这一点。但是我无法获得上述输出。

您可以尝试按项目分组并获得差异的绝对值

 df.set_index(['Items']).groupby(df.set_index(['Items']).index)['Qty'].diff().abs().dropna()
输出:

请尝试以下操作:

import numpy as np

df.groupby(['Items']).apply(lambda x: 
                                      np.select([x['Type'] == 'SELL', x['Type'] == 'BUY'], [x['Qty']*-1, x['Qty']])
                                     ).apply(sum).rename('Qty').to_frame().assign(
        Type = lambda x: np.select([x['Qty'] <0, x['Qty']>0, x['Qty']==0], ['SELL', 'BUY', None]),
        Qty = lambda x: x['Qty'].abs()
    ).dropna()

下面的代码将起作用

只需根据您的数据在if&else中添加更多条件即可 作为pd进口熊猫

data = [['myitem1',10,'Sell'],['myitem1',12,'Buy'],['myitem2',13,'Buy']]
df = pd.DataFrame(data,columns=['Items','Qty','Type'])
mylist =[]
for (idx,row) in df.iterrows():
    a = df.loc[df['Items'] == row.Items]
    item_name =a.Items
    a = a.sort_values('Type')
    no_types=a['Type'].nunique()
    if no_types ==2:
        Final_Qty = a.loc[[0],'Qty'] - a.loc[[1],'Qty']
        if Final_Qty > 0:
            new_type = "Buy"
        else:
            new_type = "Sell"
    elif no_types ==1:
        ## Code if there is only buy or sell
    mylist.append=([item_name,new_type,Final_Qty])
让我们试试:

df_out = (df.assign(Qty = np.where(df.Type == 'SELL', -df.Qty, df.Qty))
            .groupby('Items')['Qty'].sum().reset_index())
df_out['TYPE'] = np.where(np.sign(df_out.Qty)==1,'BUY','SELL')
df_out.assign(Qty=df_out.Qty.abs()).query('Qty > 0')
输出:

         Qty    Type
Items       
myitem1  206    BUY
myitem2  19     BUY
myitem4  100    SELL
     Items  Qty  TYPE
0  myitem1  206   BUY
1  myitem2   19   BUY
2  myitem4  100  SELL

我已经检查了发布的链接,不幸的是这并不能解决我的确切问题。。就我而言,买卖是有区别的。。在某些情况下,其中一行(即买入或卖出)可能不存在于某个项目中。请尝试按项目迭代df,然后执行df.loc['Buy']-df.loc['Sell']。额外检查df.loc['Buy']或sellNaga是否有任何值,除了myitem4没有出现在输出中之外,其他都可以,您是否建议我更改原始df并放入一行Sell以获得输出?我非常感谢您的努力,Naga。这很有效,谢谢Gyx hh。。我用各种形式的数据进行了测试,这在每种情况下都有效。又是Thx。看起来很复杂。你能发布更简单的版本吗?Rahul,我无法测试这个,无论如何,与可用的替代方案相比,这似乎是一个较长的代码。是的,这是一个较长的版本,但可读性更强。你可以使用另一种解决方案,但如果你想要可读的东西,请让我知道。我可以更新我的答案,这将给出所需的输出
     Items  Qty  TYPE
0  myitem1  206   BUY
1  myitem2   19   BUY
2  myitem4  100  SELL