我有一个数据框(称为u),其中一列(称为dates)包含日期。现在,我想生成另一个数据帧,它包含从u表(每行对应于日期)的最小日期和最大日期之间的所有日期。在新的数据框中,我还希望有一个列指示第一个表中有多少行的日期更小。
例如,第一个表是这样的:

| a | 2015-01-01 |
| b | 2015-01-01 |
| c | 2015-01-03 |
| d | 2015-01-04 |

第二个数据帧必须是这样的:
| 2015-01-01 | 0 |
| 2015-01-02 | 2 |
| 2015-01-03 | 2 |
| 2015-01-04 | 3 |

我写了一个完全符合我需要的代码,但是它非常慢而且不优雅。这就是我所拥有的:
min_date = u.dates.min()
max_date = u.dates.max()
dates = []
date = min_date
while True:
    dates.append(date)
    if date == max_date:
        break
    date = date + datetime.timedelta(days=1)

date2n = {}
for date in dates:
    n = len(u[u.dates < date])
    date2n[date] = n

有没有更好的方法来做我想做的事?

最佳答案

有一种方法:
获取每个日期组的计数并取累积和:

In [3]: u1 = u.groupby('dates')['dates'].count().cumsum()

In [4]: u1
Out[4]:
dates
2015-01-01    2
2015-01-03    3
2015-01-04    4
Name: dates, dtype: int64

这就给了我们小于或等于给定日期的计数,所以我们需要一天一班:
In [5]: u2 = u1.shift(1, freq='d')

In [6]: u2
Out[6]:
dates
2015-01-02    2
2015-01-04    3
2015-01-05    4
Name: dates, dtype: int64

重新编制索引以获取范围内丢失的日期:
In [7]: u3 = u2.reindex(min_date, max_date)

In [8]: u3
Out[8]:
2015-01-01   NaN
2015-01-02     2
2015-01-03   NaN
2015-01-04     3
Freq: D, Name: dates, dtype: float64

通过正向填充来填充缺少的值,并使用0填充第一个条目:
In [9]: u4 = u3.fillna(method='ffill').fillna(0)

In [10]: u4
Out[10]:
2015-01-01    0
2015-01-02    2
2015-01-03    2
2015-01-04    3
Freq: D, Name: dates, dtype: float64

关于python - 如何获得数据帧中行的累积计数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33121180/

10-11 01:43
查看更多