Python: соберите строки значения столбца в одну строку

#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, или просто «средним» в каждом столбце?