![](/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.