一次操作即可实现Pandas DataFrame组和汇总

时间:2018-09-18 14:35:50

标签: python pandas pandas-groupby

我有一个Pandas DataFrame,其中有两行“ DateTime格式”的交易“ close_time”和该行的“ net_profit”。我在下面共享了一些示例数据。我需要按日查找总交易数和获利交易数。因此,例如,输出看起来像

+-----------------------------------------------------------+
| Close_day      Total_Trades   Total_Profitable_Trades     |
+-----------------------------------------------------------+
| 2014-11-03     5              4                           |
+-----------------------------------------------------------+

可以使用groupby之类的方法来完成此操作吗?怎么样?

+------------------------------------+
|             close_time  net_profit |
+------------------------------------+
| 0  2014-10-31 14:41:41       20.84 |
| 1  2014-11-03 10:50:59      238.74 |
| 2  2014-11-03 11:05:10      491.32 |
| 3  2014-11-03 12:31:06       55.87 |
| 4  2014-11-03 14:31:34     -402.29 |
| 5  2014-11-03 20:33:29      164.18 |
| 6  2014-11-04 16:30:24     -296.96 |
| 7  2014-11-04 23:59:21      281.86 |
| 8  2014-11-04 23:59:34     -296.37 |
| 9  2014-11-05 10:14:42      517.55 |
| 10 2014-11-05 20:38:49      350.35 |
| 11 2014-11-07 11:23:31      710.13 |
| 12 2014-11-07 11:23:38      137.55 |
| 13 2014-11-11 19:00:01      201.97 |
| 14 2014-11-11 19:00:15     -484.77 |
| 15 2014-11-12 23:41:04    -1346.71 |
| 16 2014-11-12 23:41:25      514.30 |
| 17 2014-11-13 18:55:34      103.34 |
| 18 2014-11-13 18:55:43     -180.37 |
| 19 2014-11-26 17:10:59    -1756.69 |
+------------------------------------+

1 个答案:

答案 0 :(得分:1)

设置

使用

确保您的close_timedatetime
df.close_time = pd.to_datetime(df.close_time)

您可以在此处使用groupbyagg

out = (df.groupby(df.close_time.dt.date)
          .net_profit.agg(['count', lambda x: x.gt(0).sum()])).astype(int)

out.columns = ['trades', 'profitible_trades']

            trades  profitible_trades
close_time
2014-10-31      1         1
2014-11-03      5         4
2014-11-04      3         1
2014-11-05      2         2
2014-11-07      2         2
2014-11-11      2         1
2014-11-12      2         1
2014-11-13      2         1
2014-11-26      1         0