如何使用 pandas reindex 和多个索引来填充空值?
How to fill null values using pandas reindex with multiple indexes?
我正在尝试为数据集中的每一天生成一组汇总统计信息。具体来说,我想知道在特定值范围内、高于和低于特定值范围内花费的时间百分比。
开始示例 df:
date value
2022-05-01 17:03:45 120
2022-05-02 17:08:45 55
2022-05-03 17:13:45 230
2022-05-04 17:18:45 285
2022-05-05 17:23:45 140
然后我根据以下条件创建一个新专栏:
df['range'] = ['extreme low' if bgl <= 54 else 'low' if bgl < 70 else 'extreme high' if bgl > 250 else 'high' if bgl >= 180 else 'in range' for bgl in df['bgl']]
df.head()
date value range
2022-05-01 17:03:45 120 in range
2022-05-02 17:08:45 55 low
2022-05-03 17:13:45 230 high
2022-05-04 17:18:45 285 extreme high
2022-05-05 17:23:45 41 extreme low
问题:
有些日子,例如,极低 类别中没有值。即使这是真的,我仍然希望在我的汇总统计中看到 extreme low: 0
。
当我按日期分组并使用 value_counts()
和 reindex()
时,我的结果非常接近我想要的结果。但是,即使使用 fill_value=0
,我也没有得到带有“0”的行:
categories = ['extreme low', 'low', 'in range', 'high', 'extreme high']
daily_summaries = df.groupby(pd.Grouper(key='date', axis=0, freq='D'))['range'].value_counts(normalize=True).reindex(categories, level=1, fill_value=0).mul(100).round(1)
print(daily_summaries)
导致:
date range
2022-05-02 low 2.7
in range 77.8
high 13.6
extreme high 5.9
我想要的输出是这样的:
date range
2022-05-02 extreme low 0
low 2.7
in range 77.8
high 13.6
extreme high 5.9
我希望这是有道理的。任何帮助或建议将不胜感激。我确定我遗漏了一些相当简单的东西,但我似乎无法弄清楚。提前致谢!
在你的第一个你可以做到cut
df['range'] = pd.cut(df.value,
bins = [0,54,70,180,250,np.inf],
labels = ['extreme low','low','in range','high','extreme high'])
第二次
out = pd.crosstab(df['date'].dt.date, df['range']).reindex(categories, axis=1,fill_value=0).stack()
正在创建数据框:
df = pd.DataFrame({
'date':['2022-05-01', '2022-05-01', '2022-05-02', '2022-05-02', '2022-05-03'],
'value': [120, 55, 230, 285, 41]
})
df.date = pd.to_datetime(df.date)
分类范围:
df['range'] = 'extreme low'
df['range'] = np.where((df.value>54) & (df.value<70),'low',df['range'])
df['range'] = np.where((df.value>=70) & (df.value<180),'in range',df['range'])
df['range'] = np.where((df.value>=180) & (df.value<250),'high',df['range'])
df['range'] = np.where((df.value>=250),'extreme high',df['range'])
接下来,我们先用&分组得到一个新的table:
count_df = df.groupby(['date','range']).size().reset_index(name='counts')
您终于可以旋转它以获得 0 项的计数:
pd.pivot_table(count_df,
index=['date','range'],
values='counts',
fill_value = 0,
dropna=False,
aggfunc=np.sum)
输出:
我正在尝试为数据集中的每一天生成一组汇总统计信息。具体来说,我想知道在特定值范围内、高于和低于特定值范围内花费的时间百分比。
开始示例 df:
date value
2022-05-01 17:03:45 120
2022-05-02 17:08:45 55
2022-05-03 17:13:45 230
2022-05-04 17:18:45 285
2022-05-05 17:23:45 140
然后我根据以下条件创建一个新专栏:
df['range'] = ['extreme low' if bgl <= 54 else 'low' if bgl < 70 else 'extreme high' if bgl > 250 else 'high' if bgl >= 180 else 'in range' for bgl in df['bgl']]
df.head()
date value range
2022-05-01 17:03:45 120 in range
2022-05-02 17:08:45 55 low
2022-05-03 17:13:45 230 high
2022-05-04 17:18:45 285 extreme high
2022-05-05 17:23:45 41 extreme low
问题:
有些日子,例如,极低 类别中没有值。即使这是真的,我仍然希望在我的汇总统计中看到 extreme low: 0
。
当我按日期分组并使用 value_counts()
和 reindex()
时,我的结果非常接近我想要的结果。但是,即使使用 fill_value=0
,我也没有得到带有“0”的行:
categories = ['extreme low', 'low', 'in range', 'high', 'extreme high']
daily_summaries = df.groupby(pd.Grouper(key='date', axis=0, freq='D'))['range'].value_counts(normalize=True).reindex(categories, level=1, fill_value=0).mul(100).round(1)
print(daily_summaries)
导致:
date range
2022-05-02 low 2.7
in range 77.8
high 13.6
extreme high 5.9
我想要的输出是这样的:
date range
2022-05-02 extreme low 0
low 2.7
in range 77.8
high 13.6
extreme high 5.9
我希望这是有道理的。任何帮助或建议将不胜感激。我确定我遗漏了一些相当简单的东西,但我似乎无法弄清楚。提前致谢!
在你的第一个你可以做到cut
df['range'] = pd.cut(df.value,
bins = [0,54,70,180,250,np.inf],
labels = ['extreme low','low','in range','high','extreme high'])
第二次
out = pd.crosstab(df['date'].dt.date, df['range']).reindex(categories, axis=1,fill_value=0).stack()
正在创建数据框:
df = pd.DataFrame({
'date':['2022-05-01', '2022-05-01', '2022-05-02', '2022-05-02', '2022-05-03'],
'value': [120, 55, 230, 285, 41]
})
df.date = pd.to_datetime(df.date)
分类范围:
df['range'] = 'extreme low'
df['range'] = np.where((df.value>54) & (df.value<70),'low',df['range'])
df['range'] = np.where((df.value>=70) & (df.value<180),'in range',df['range'])
df['range'] = np.where((df.value>=180) & (df.value<250),'high',df['range'])
df['range'] = np.where((df.value>=250),'extreme high',df['range'])
接下来,我们先用&分组得到一个新的table:
count_df = df.groupby(['date','range']).size().reset_index(name='counts')
您终于可以旋转它以获得 0 项的计数:
pd.pivot_table(count_df,
index=['date','range'],
values='counts',
fill_value = 0,
dropna=False,
aggfunc=np.sum)
输出: