在groupby函数pandas中过滤



我正在处理pandas,并且有一个包含TradeID、Seller ID和付款日期的销售信息数据框,并且我想为每个Seller ID计算在当前交易日期之前,卖方所拥有的先前成功交易的数量。我很确定这是一个拆分应用组合样式的解决方案,但我不知道如何实现它。

数据看起来有点像这样

|---------|-----------|-------------|------------|
|Trade ID | Seller ID | Payment Date|Success?    |
|---------|-----------|-------------|------------|
|001      |001        |08/12/2016   |Yes         |
|002      |001        |07/12/2016   |Yes         |
|003      |001        |12/12/2016   |No          |
|004      |001        |13/12/2016   |Yes         |
|005      |001        |14/12/2016   |Null        |
|005      |002        |18/01/2012   |Yes         |
|006      |002        |01/01/2011   |Null        |
|007      |003        |07/02/2010   |Yes         |

,我正在寻找一个类似于:

的输出:
|---------|-----------|-------------|------------|--------------------------|
|Trade ID | Seller ID | Payment Date|Success?    |Previous Succesful Trades |
|---------|-----------|-------------|------------|--------------------------|
|001      |001        |08/12/2016   |Yes         |1                         |
|002      |001        |07/12/2016   |Yes         |0                         |
|003      |001        |12/12/2016   |No          |2                         |
|004      |001        |13/12/2016   |Yes         |2                         |
|005      |001        |14/12/2016   |Null        |3                         |
|005      |002        |18/01/2012   |Yes         |1                         |
|006      |002        |01/01/2011   |Null        |0                         |
|007      |003        |07/02/2010   |Yes         |0                         |

我可以汇总每个卖家的成功交易,但这并没有考虑到这样一个事实:在卖家进行交易时,他们还没有完成数据框架中的所有交易。例如,在2016年12月12日,卖方1将不会在2016年12月13日完成交易,因此他们之前成功完成的交易是2而不是3。

任何帮助都非常感谢!

您可以应用过滤器,然后使用groupbycount

df[df['Success'] == 'Yes'].groupby(['Seller ID'])['Success'].count()
Seller ID
001    1
002    1
df.loc[( df['Success?'] == 'Yes' )  , 'Succ'] = 1
df['sumofprevios'] = ( df.groupby('Seller ID')['Succ'].apply(lambda x: x.shift().expanding().sum()))
# you can drop Succ column now. 

如果这不是你需要的,请告诉我。

我能想到的最简单的方法是首先将"是"one_answers"否"替换为"真"one_answers"假",然后按Seller ID分组并对Success?求和。

df['Success?'] = df['Success?'].replace({'Yes':True, 'No': False})
df.groupby('Seller ID')['Success?'].sum()

pandas文档对于确定这些解决方案非常有帮助!下面是记录不成功交易的一种可能性。

df = pd.DataFrame(
{"Trade ID":[1,2,3,4,5,6],
"Seller ID":[1,1,2,2,2,2],
"Payment Date":["2016-12=08","2016-12-12","2012-01-18","2016-02=08","2016-12-16","2012-01-31"],
"Success?":["Yes","No", "Yes", "Yes","No", "Yes"]})

然后在卖方ID上分组

grouped_seller = df.groupby("Seller ID")

然后你可以做多个不同的事情,但是值计数将计算每个卖家ID是YES或No的次数

grouped_seller["Success?"].value_counts()

Seller ID  Success?
1          No          1
Yes         1
2          Yes         3
No          1
Name: Success?, dtype: int64

你可以使用。loc[]访问卖家id

grouped_seller["Success?"].value_counts().loc[2]
Success?
Yes    3
No     1
Name: Success?, dtype: int64

注意:我创建的数据框架不会和你的数据框架具有相同的dtypes,除非你将日期转换为datetime

最新更新