Сортировка данных в мультииндексный фрейм данных - PullRequest
0 голосов
/ 27 апреля 2018

Как отсортировать данные из DataFrame в DataFrame, который использует MultiIndex для индексов и столбцов?

Например, конвертировать из этого:

     0    1  2     3     4
0  foo  two  A  2.30  0.01
1  foo  one  A  4.12  0.13
2  bar  two  B  9.89  3.66
3  foo  one  A  2.11  9.48
4  bar  two  A  1.07  5.55

к этому:

            A           B      
            1     2     1     2
foo one  2.11  9.48   NaN   NaN
    two   2.3  0.01   NaN   NaN
bar one   NaN   NaN   NaN   NaN
    two  1.07  5.55  9.89  3.66

В настоящее время я перебираю каждую строку в df1 и обновляю значения в df2, но я бы хотел более эффективный метод, чем этот:

for index, row in df1.iterrows():
    df2.loc[(row[0], row[1]), row[2]] = list(row[3:])

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать:

def f(x):
    return pd.DataFrame({'a':x.values.ravel()}).rename(lambda x: x + 1)

df = df.groupby([0,1,2])[3,4].apply(f)['a'].unstack([2,3]).sort_index(level=0, axis=1)
df = df.rename_axis((None, None),axis=1).reindex(pd.MultiIndex.from_product(df.index.levels))
print (df)
            A                       B      
            1     2     3     4     1     2
bar one   NaN   NaN   NaN   NaN   NaN   NaN
    two  1.07  5.55   NaN   NaN  9.89  3.66
foo one  4.12  0.13  2.11  9.48   NaN   NaN
    two  2.30  0.01   NaN   NaN   NaN   NaN

Объяснение

  1. Для каждой группы по первым 3 столбцам apply пользовательская функция с DataFrame, также увеличить значение индекса для запуска с 1

  2. Изменить на unstack и отсортировать Multiindex в столбцах по sort_index

  3. Удалите имена столбцов (2 в левом углу) и добавьте недостающие категории к MultiIndex в индексе на reindex и MultiIndex.from_product

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...