簡體   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