繁体   English   中英

如何使用 pandas groupby.count() 作为条件

[英]How can I use pandas groupby.count() for a condition

我有一个 dataframe df ,有两列,Ticker 和 Trade Results。

我想创建一个新的 dataframe,包含三列 - 代码、交易数量、盈利交易。

我使用groupbycount function 来获得交易数量列,这很好用。

我的问题是第三列获利交易,其中交易结果 > 0,我还没有找到解决这种情况的方法。

创建 DF(工作正常)

df = pd.DataFrame(
    {'Ticker': ['[BTC]','[ETH]','[LTC]','[BTC]','[ETH]',
              '[LTC]','[BTC]','[ETH]','[LTC]'],
     'Trade Results': [5,10,5,-5,-10,-5,5,10,5]}
)
股票代码 交易结果
比特币 5
以太坊 10
LTC 5
比特币 -5
以太坊 -10
LTC -5
比特币 5
以太坊 10
LTC 5

分组代码和计数(工作正常)

df_Grouped = df.groupby(['Ticker']).count()
股票代码 数数
比特币 3
以太坊 3
LTC 3

条件列(我的问题)

这是我无法弄清楚的部分,我最近的尝试如下,但为盈利列返回 NaN。

df_Grouped['Profitable'] = df.groupby(['Trade Result'] > 0).count()

所需 Output

股票代码 数数 有利可图
比特币 3 2
以太坊 3 2
LTC 3 2

你可以这样做:

df_Grouped = df.groupby(['Ticker']).agg({'Trade Results': [('Count', 'count'), ('Profitable', lambda x: len(x[x>0]))]}).reset_index()

Output:

                 Count Profitable
0  BTC             3          2
1  ETH             3          2
2  LTC             3          2

您可以随时进行预过滤,但我喜欢@David Ms 的回答

df_Grouped['Profitable'] = df[df['Trade Results'] > 0].groupby(['Ticker']).count()

在对 groupby 进行聚合之前,您可以为大于 0 的行创建 boolean:

(
    df.assign(gt_0=df["Trade Results"].gt(0))
    .groupby("Ticker")
    .agg(Count=("gt_0", "size"), Profitable=("gt_0", "sum"))
)

    Count   Profitable
Ticker      
BTC     3   2
ETH     3   2
LTC     3   2

您还可以使用 groupBy 创建一个新的 df 然后合并它。

df_Grouped = df.groupby(['Ticker']).count()
df_Grouped.reset_index(level = 'Ticker')
df_new = df[df['Trade Results'] >0].groupby(['Ticker']).count().reset_index(level = 'Ticker')
print(pd.merge(df_Grouped, df_new, left_on='Ticker', right_on='Ticker', how='left'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM