gpt4 book ai didi

python - 相对于任意级别的 Pandas Reindexing MultiIndex

转载 作者:行者123 更新时间:2023-11-28 19:42:32 27 4
gpt4 key购买 nike

我正在尝试相对于索引的第二级重新索引数据框。我有一个数据框,其中索引的第一级是用户 ID,第二级是日期。例如:

pd.DataFrame({
'id': 3*['A'] + 5*['B'] + 4*['C'],
'date': ['01-01-2010', '02-01-2010', '12-01-2010',
'04-01-2015', '05-01-2015', '03-01-2016', '04-01-2016', '05-01-2016',
'01-01-2015', '02-01-2015', '03-01-2015', '04-01-2015'],
'value': np.random.randint(10,100, 12)})\
.set_index(['id', 'date'])

我想重新索引日期以填充缺失的日期,但仅限于每个“id”组的最大和最小日期之间的日期。

例如,用户“A”应该有从 2010 年 1 月到 2010 年 12 月的连续月度数据,用户“B”应该有从 2015 年 4 月到 2016 年 5 月的连续日期。为简单起见,我们假设我想用零填充 NaN。

与此类似的其他问题假设我想对所有用户使用相同的 date_range,这在这个用例中不起作用。有什么想法吗?

最佳答案

我想你需要reset_index + groupby + resample + asfreq + fillna :

np.random.seed(123)
df = pd.DataFrame({
'id': 3*['A'] + 5*['B'] + 4*['C'],
'date': ['01-01-2010', '02-01-2010', '12-01-2010',
'04-01-2015', '05-01-2015', '03-01-2016', '04-01-2016', '05-01-2016',
'01-01-2015', '02-01-2015', '03-01-2015', '04-01-2015'],
'value': np.random.randint(10,100, 12)})

df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['id', 'date'])
print (df)
value
id date
A 2010-01-01 76
2010-02-01 27
2010-12-01 93
B 2015-04-01 67
2015-05-01 96
2016-03-01 57
2016-04-01 83
2016-05-01 42
C 2015-01-01 56
2015-02-01 35
2015-03-01 93
2015-04-01 88

df1 = df.reset_index(level='id').groupby('id')['value'].resample('D').asfreq().fillna(0)
print (df1.head(10))
value
id date
A 2010-01-01 76.0
2010-01-02 0.0
2010-01-03 0.0
2010-01-04 0.0
2010-01-05 0.0
2010-01-06 0.0
2010-01-07 0.0
2010-01-08 0.0
2010-01-09 0.0
2010-01-10 0.0

但是如果只需要处理最大和最小dates 首先需要用agg 选择数据通过 idxmax idxminloc :

df = df.reset_index()
df1 = df.loc[df.groupby('id')['date'].agg(['idxmin', 'idxmax']).stack()]
print (df1)
id date value
0 A 2010-01-01 76
2 A 2010-12-01 93
3 B 2015-04-01 67
7 B 2016-05-01 42
8 C 2015-01-01 56
11 C 2015-04-01 88

df1 = df1.set_index('date').groupby('id')['value'].resample('MS').asfreq().fillna(0)
print (df1.head(10))

关于python - 相对于任意级别的 Pandas Reindexing MultiIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44291273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com