Pandas 中的多索引填充
Multi-Indexed fillna in Pandas
我有一个多索引数据框,我希望回填组中的缺失值。我目前拥有的数据框如下所示:
df = pd.DataFrame({
'group': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2,
'Date': ["2013-06-11",
"2013-07-02",
"2013-07-09",
"2013-07-30",
"2013-08-06",
"2013-09-03",
"2013-10-01",
"2013-07-09",
"2013-08-06",
"2013-09-03",
"2013-07-09",
"2013-09-03"],
'Value': [np.nan, np.nan, np.nan, 9, 4, 40, 18, np.nan, np.nan, 5, np.nan, 2]})
df.Date = df['Date'].apply(lambda x: pd.to_datetime(x).date())
df = df.set_index(['group', 'Date'])
我正在尝试获取一个数据框来回填组中的缺失值。
像这样:
Group Date Value
group_a 2013-06-11 9
2013-07-02 9
2013-07-09 9
2013-07-30 9
2013-08-06 4
2013-09-03 40
2013-10-01 18
group_b 2013-07-09 5
2013-08-06 5
2013-09-03 5
group_c 2013-07-09 2
2013-09-03 2
我尝试使用 pd.fillna('Value', inplace=True)
,但我收到关于在副本上设置值的警告,后来我发现这与多索引的存在有关。有没有办法让 fillna 为多索引行工作?另外,理想情况下,我只能将 fillna 应用于一列而不是整个数据框。
任何对此的见解都会很棒。
使用 groupby(level=0)
然后 bfill
和 update
:
df.update(df.groupby(level=0).bfill())
df
注意:update
原地更改 df
。
其他选择
df = df.groupby(level='group').bfill()
df = df.unstack(0).bfill().stack().swaplevel(0, 1).reindex_like(df)
特定列
df.Value = df.groupby(level=0).Value.bfill()
我有一个多索引数据框,我希望回填组中的缺失值。我目前拥有的数据框如下所示:
df = pd.DataFrame({
'group': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2,
'Date': ["2013-06-11",
"2013-07-02",
"2013-07-09",
"2013-07-30",
"2013-08-06",
"2013-09-03",
"2013-10-01",
"2013-07-09",
"2013-08-06",
"2013-09-03",
"2013-07-09",
"2013-09-03"],
'Value': [np.nan, np.nan, np.nan, 9, 4, 40, 18, np.nan, np.nan, 5, np.nan, 2]})
df.Date = df['Date'].apply(lambda x: pd.to_datetime(x).date())
df = df.set_index(['group', 'Date'])
我正在尝试获取一个数据框来回填组中的缺失值。 像这样:
Group Date Value
group_a 2013-06-11 9
2013-07-02 9
2013-07-09 9
2013-07-30 9
2013-08-06 4
2013-09-03 40
2013-10-01 18
group_b 2013-07-09 5
2013-08-06 5
2013-09-03 5
group_c 2013-07-09 2
2013-09-03 2
我尝试使用 pd.fillna('Value', inplace=True)
,但我收到关于在副本上设置值的警告,后来我发现这与多索引的存在有关。有没有办法让 fillna 为多索引行工作?另外,理想情况下,我只能将 fillna 应用于一列而不是整个数据框。
任何对此的见解都会很棒。
使用 groupby(level=0)
然后 bfill
和 update
:
df.update(df.groupby(level=0).bfill())
df
注意:update
原地更改 df
。
其他选择
df = df.groupby(level='group').bfill()
df = df.unstack(0).bfill().stack().swaplevel(0, 1).reindex_like(df)
特定列
df.Value = df.groupby(level=0).Value.bfill()