#python #pandas #dataframe #pandas-groupby
#python #pandas #фрейм данных #pandas-groupby
Вопрос:
У меня есть фрейм данных df со столбцами a, b, c, d и e. Чего я хочу, так это группировать по df на основе a, b и c. И затем для каждой группы я хочу удалить нулевое значение столбцов d и e с наиболее частым значением этого столбца в этой группе. И затем, наконец, удалите дубликаты для каждой группы.
Я выполняю следующую обработку:
final_df = pd.DataFrame()
grouped = df.groupby(['a', 'b', 'c'])
for _, group in grouped:
group = group.replace('', np.nan)
group = group.fillna(group.mode().iloc[0])
group.drop_duplicates(keep='first', inplace=True)
final_df = pd.concat([rows_to_insert, final_df])
Но итерация делает мою обработку действительно очень медленной. Может кто-нибудь предложить мне лучший способ сделать это?
Пример ввода:
a b c d e
a1 b1 c1 NULL e2
a2 b2 c2 NULL NULL
a2 b2 c2 NULL NULL
a1 b1 c3 d4 e4
a1 b1 c1 NULL e2
a1 b1 c1 d1 e2
a1 b1 c1 d1 NULL
Пример вывода:
a b c d e
a1 b1 c1 d1 e2
a2 b2 c2 NULL NULL
a1 b1 c3 d4 e4
Ответ №1:
Вы хотите groupby().mode
с уловом, когда все данные NaN
:
def get_mode(series):
out = series.mode()
return out.iloc[0] if len(out) else np.nan
df.groupby(['a','b','c'], as_index=False, sort=False).agg(get_mode)
Вывод:
a b c d e
0 a1 b1 c1 d1 e2
1 a2 b2 c2 NaN NaN
2 a1 b1 c3 d4 e4
И если вы хотите заполнить свой исходный фрейм данных режимом:
df[['d','e']] = df.groupby(['a','b','c']).transform(get_mode)
Вывод:
a b c d e
0 a1 b1 c1 d1 e2
1 a2 b2 c2 NaN NaN
2 a2 b2 c2 NaN NaN
3 a1 b1 c3 d4 e4
4 a1 b1 c1 d1 e2
5 a1 b1 c1 d1 e2
6 a1 b1 c1 d1 e2