我有一个从2015年1月1日到2019年3月3日的每日数据的熊猫数据框。将其读取到df并逐月/逐年应用会产生杂散值,直到2019年12月。这是获取MultiIndex级别的代码:
col_types = {'count': np.int64, 'value': np.float64}
df = pd.read_csv("myfile.csv", sep = '\t', index_col = 1, dtype = col_types, parse_dates=True)
df.dtypes # count int64, value float64
type(df.index) #pandas.core.indexes.datetimes.DatetimeIndex
group_by_list = [df.index.year, df.index.month]
grouped_df = df.groupby(group_by_list).sum()
index_rename_names_list = ['year', 'month']
index_rename_position_list = [0, 1]
grouped_df.index.rename(index_rename_names_list, index_rename_position_list, inplace = True)
grouped_df.index
MultiIndex(levels=[[2015, 2016, 2017, 2018, 2019], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
codes=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11]],
names=['year', 'month'])
即使对于超出数据范围的日期,似乎也正在创建MultiIndex级别。除了在groupby()调用本身期间避免过滤之外,还有其他方法可以避免这种情况吗?谢谢
答案 0 :(得分:1)
问题似乎出在原始DataFrame df
的索引上,例如如果我们将df = pd.DataFrame({'a': 1}, index=pd.date_range('2015-01-01', '2019-03-03'))
设置为有效,则不会出现任何问题:
df = pd.DataFrame({'a': 1}, index=pd.date_range('2015-01-01', '2019-03-03'))
group_by_list = [df.index.year, df.index.month]
grouped_df = df.groupby(group_by_list).sum()
index_rename_names_list = ['year', 'month']
index_rename_position_list = [0, 1]
grouped_df.index.rename(index_rename_names_list, index_rename_position_list, inplace = True)
grouped_df.index.max()
输出:
(2019, 3)
P.S。顺便说一句,是否有不使用resample
而不是groupby的原因?