- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 pandas 系列(我通过将两列分组divvy_df.groupby(['from_station_name', 'starttime']).size()
):
from_station_name starttime
900 W Harrison 2014-07-01 08:00:00 1
2014-07-01 10:00:00 1
2014-07-01 11:00:00 1
2014-07-01 12:00:00 1
2014-07-01 13:00:00 1
2014-07-01 16:00:00 1
2014-07-01 17:00:00 3
2014-07-01 22:00:00 1
2014-07-02 01:00:00 1
2014-07-02 08:00:00 1
2014-07-02 12:00:00 2
...
如您所见,结果系列显示了为该站名称记录开始时间的次数。不过,我想以某种方式实现它,以便创建缺失 的时隙并用值 0 填充。这可能吗?
所以我想要这样的东西:
from_station_name starttime
900 W Harrison 2014-07-01 00:00:00 0
2014-07-01 01:00:00 0
2014-07-01 02:00:00 0
2014-07-01 03:00:00 0
...
2014-07-01 08:00:00 1
2014-07-01 09:00:00 0
2014-07-01 10:00:00 1
2014-07-01 11:00:00 1
2014-07-01 12:00:00 1
2014-07-01 13:00:00 0
...
2014-07-01 22:00:00 1
2014-07-01 23:00:00 0
2014-07-02 00:00:00 0
完成这样的事情的最佳方法是什么?
最佳答案
通常当你有一个系列,ts
,带有 DatetimeIndex 时,你可以将它展开为使用 ts.reindex
、ts.asfreq
或 ts.resample
包含新日期。由于 ts.reindex
有一个 fill_value
参数用于填充缺失值,我认为在这种情况下使用 ts.reindex
是最简单的。
但是,在这个问题中,ts
有一个带有 from_station_name
的 MultiIndex 和开始时间
级别。
所以第一步是将 from_station_name
级别移出索引。有两种选择。您可以使用 reset_index
将其移动到列中,或使用unstack
将其移动到新的列索引级别。我认为 unstacking
与
ts = ts.unstack(level=0)
在这里是更好的选择,因为使用其他选项(使用 reset_index
)您遇到与索引中的重复日期相关的问题,以及回填和前向填充缺少的 from_station_name
值。
现在 Series 有一个单层 DatetimeIndex,所以你可以像这样reindex
:
index = pd.date_range('2014-07-01', '2014-07-03', freq='H')
ts = ts.reindex(index, fill_value=0)
现在撤消unstack
操作,从而将列索引级别移回进入行索引:
ts = ts.stack()
ts = ts.swaplevel(0,1)
import pandas as pd
ts = pd.Series({('900 W Harrison', '2014-07-01 08:00:00'): 1,
('900 W Harrison', '2014-07-01 10:00:00'): 1,
('900 W Harrison', '2014-07-01 11:00:00'): 1,
('900 W Harrison', '2014-07-01 12:00:00'): 1,
('900 W Harrison', '2014-07-01 13:00:00'): 1,
('900 W Harrison', '2014-07-01 16:00:00'): 1,
('900 W Harrison', '2014-07-01 17:00:00'): 3,
('900 W Harrison', '2014-07-01 22:00:00'): 1,
('900 W Harrison', '2014-07-02 01:00:00'): 1,
('900 W Harrison', '2014-07-02 08:00:00'): 1,
('900 W Harrison', '2014-07-02 12:00:00'): 2})
ts = ts.unstack(level=0)
# ensure ts.index is a DatetimeIndex
ts.index = pd.to_datetime(ts.index)
index = pd.date_range('2014-07-01', '2014-07-03', freq='H')
ts = ts.reindex(index, fill_value=0)
ts = ts.stack()
ts = ts.swaplevel(0,1)
ts = ts.sortlevel()
print(ts)
产量
900 W Harrison 2014-07-01 00:00:00 0
2014-07-01 01:00:00 0
2014-07-01 02:00:00 0
2014-07-01 03:00:00 0
2014-07-01 04:00:00 0
2014-07-01 05:00:00 0
2014-07-01 06:00:00 0
2014-07-01 07:00:00 0
2014-07-01 08:00:00 1
2014-07-01 09:00:00 0
2014-07-01 10:00:00 1
...
2014-07-02 21:00:00 0
2014-07-02 22:00:00 0
2014-07-02 23:00:00 0
2014-07-03 00:00:00 0
dtype: int64
关于python - 在 Pandas 系列中制作缺失的时隙并填充 0 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576851/
我是一名优秀的程序员,十分优秀!