![](/img/trans.png)
[英]Pandas pivot_table not behaving as expected when having few different values in groupby.count
[英]How can I use pandas groupby.count() for a condition
我有一個 dataframe df
,有兩列,Ticker 和 Trade Results。
我想創建一個新的 dataframe,包含三列 - 代碼、交易數量、盈利交易。
我使用groupby
和count
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.