#python #pandas
Вопрос:
мой исходный кадр данных выглядит следующим образом:
A B C D
2 10 39 109
1 8 40 111
3 9 38 108
2 11 41 107
3 13 40 112
2 12 39 113
вывод, который я желаю (объединить строки на основе значений столбца A):
A B C D A1 B1 C1 D1 A2 B2 C2 D2
2 10 39 109 11 41 107 12 39 113
1 8 40 111 НА НА НА НА НА НА НА
3 9 38 108 13 40 112 НА НА НА
Ответ №1:
Используйте GroupBy.cumcount
с DataFrame.unstack
для изменения формы:
g = df.groupby('A').cumcount()
df1 = df.set_index(['A',g]).unstack().sort_index(level=1, axis=1)
df1.columns = [f'{a}{b}' if b != 0 else a for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
A B C D B1 C1 D1 B2 C2 D2
0 1 8.0 40.0 111.0 NaN NaN NaN NaN NaN NaN
1 2 10.0 39.0 109.0 11.0 41.0 107.0 12.0 39.0 113.0
2 3 9.0 38.0 108.0 13.0 40.0 112.0 NaN NaN NaN
df = df.apply(pd.Categorical)
g = df.groupby('A').cumcount()
df1 = df.set_index(['A',g]).unstack().sort_index(level=1, axis=1)
df1 = df1.apply(lambda x: x.cat.add_categories([0])).fillna(0)
df1.columns = [f'{a}{b}' if b != 0 else a for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
A B C D B1 C1 D1 B2 C2 D2
0 1 8 40 111 0 0 0 0 0 0
1 2 10 39 109 11 41 107 12 39 113
2 3 9 38 108 13 40 112 0 0 0
Комментарии:
1. Каков наилучший способ заполнения NaN для этой таблицы, если поля являются категориальными? @jezrael
2. @A. Фругиан — Вам нужно заменить
NaN
на то же значение, например0
, или-1
?3. это изменяет атрибуты данных. Я не хочу их менять. может быть, заполнение с помощью каждой колонки или МЫШИ-лучший способ.
4. @A. Фругиан — Тебе нужно
df1 = df1.T.fillna(df1.mean(axis=1)).T.reset_index()
?5. Мне нужно знать, для чего лучше всего использовать и как заполнять категориальные NAN в наборе данных с сотнями столбцов. является ли MICE лучшим, или KNN, или просто «средним» в каждом столбце?