我有一个数据框(称为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/