#python #pandas #group-by
#python #pandas #групповое заполнение
Вопрос:
У меня есть следующий фрейм данных с некоторыми отсутствующими значениями. Я хочу использовать ffill()
для заполнения пропущенных значений в обоих var1
и var2
сгруппированных по date
и building
. Я могу делать это для одной переменной за раз, но когда я пытаюсь сделать это для обеих, происходит сбой. Как я могу сделать это для обеих переменных одновременно, при этом не изменяя, а сохраняя var3
или var4
?
df = pd.DataFrame({
'date': ['2019-01-01','2019-01-01','2019-01-01','2019-01-01','2019-02-01','2019-02-01','2019-02-01','2019-02-01'],
'building': ['a', 'a', 'b', 'b', 'a', 'a', 'b', 'b'],
'var1': [1.5, np.nan, 2.1, 2.2, 1.2, 1.3, 2.4, np.nan],
'var2': [100, 110, 105, np.nan, 102, np.nan, 103, 107],
'var3': [10, 11, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
'var4': [1, 2, 3, 4, 5, 6, 7, 8]
})
df
date building var1 var2 var3 var4
0 2019-01-01 a 1.5 100.0 10.0 1
1 2019-01-01 a NaN 110.0 11.0 2
2 2019-01-01 b 2.1 105.0 NaN 3
3 2019-01-01 b 2.2 NaN NaN 4
4 2019-02-01 a 1.2 102.0 NaN 5
5 2019-02-01 a 1.3 NaN NaN 6
6 2019-02-01 b 2.4 103.0 NaN 7
7 2019-02-01 b NaN 107.0 NaN 8
# This works
df['var1'] = df.groupby(['date', 'building'])['var1'].ffill()
df['var2'] = df.groupby(['date', 'building'])['var2'].ffill()
df
date building var1 var2 var3 var4
0 2019-01-01 a 1.5 100.0 10.0 1
1 2019-01-01 a 1.5 110.0 11.0 2
2 2019-01-01 b 2.1 105.0 NaN 3
3 2019-01-01 b 2.2 105.0 NaN 4
4 2019-02-01 a 1.2 102.0 NaN 5
5 2019-02-01 a 1.3 102.0 NaN 6
6 2019-02-01 b 2.4 103.0 NaN 7
7 2019-02-01 b 2.4 107.0 NaN 8
# This doesn't work
df[['var1', 'var2']] = df.groupby(['date', 'building'])[['var1', 'var2']].ffill()
ValueError: Columns must be same length as key
Ответ №1:
Я думаю, вам нужно добавить fillna
перед вашим groupby
.
df[["var1", "var2"]] = df[["var1", "var2"]].fillna(df.groupby(['date', 'building'])[["var1", "var2"]].ffill())
date building var1 var2 var3 var4
0 2019-01-01 a 1.5 100.0 10.0 1
1 2019-01-01 a 1.5 110.0 11.0 2
2 2019-01-01 b 2.1 105.0 NaN 3
3 2019-01-01 b 2.2 105.0 NaN 4
4 2019-02-01 a 1.2 102.0 NaN 5
5 2019-02-01 a 1.3 102.0 NaN 6
6 2019-02-01 b 2.4 103.0 NaN 7
7 2019-02-01 b 2.4 107.0 NaN 8
Ответ №2:
Делайте это итеративно:
gb = df.groupby(['date', 'building'])
for g in ["var1", "var2"]:
df[g] = gb[g].ffill()
date building var1 var2 var3 var4
0 2019-01-01 a 1.5 100.0 10.0 1
1 2019-01-01 a 1.5 110.0 11.0 2
2 2019-01-01 b 2.1 105.0 NaN 3
3 2019-01-01 b 2.2 105.0 NaN 4
4 2019-02-01 a 1.2 102.0 NaN 5
5 2019-02-01 a 1.3 102.0 NaN 6
6 2019-02-01 b 2.4 103.0 NaN 7
7 2019-02-01 b 2.4 107.0 NaN 8
Комментарии:
1. Проблема здесь в том, что сохраняются только
var1
и.var2
Я изменил свой вопрос, чтобы включить другие переменные, которые не следует удалять или изменять.
Ответ №3:
@Gaurav Bansal Вам просто не хватает нескольких столбцов при установке group by в фрейме данных.
df[['date', 'building','var1', 'var2']] = df.groupby(['date', 'building'])[['var1', 'var2']].ffill()
Group by вернет фрейм данных с четырьмя столбцами, который является ‘date’, building’, ‘var1’ и ‘var2’, или вы можете просто предоставить фрейм данных для хранения обработанного фрейма данных.
Поэтому вам нужно сохранить его в df с четырьмя столбцами, чтобы получить идеальное соответствие для возвращаемого значения ключа.