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

извинения, но это поставило меня в тупик, я думал, что могу передать следующий кадр данных в простой файл pd.melt, используя iloc для ссылки на мои переменные, но он не работает для меня (я опубликую ошибку через минуту)

образец df

Date,     0151,        0561,       0522,   0912
0,Date,     AVG Review,  AVG Review, Review, Review 
1,Date      NaN          NaN          NaN    NaN
2,01/01/18  2            2.5          4        5 

так, как вы можете видеть, мой идентификатор, как в верхней строке, тип обзора во 2-й строке, дата находится в первом столбце и наблюденияобзора в строках на дату.

что я пытаюсь сделать, это расплавить этот df, чтобы получить следующее

ID,   Date,     Review,        Score
0151, 01/01/18, Average Review 2

Я думал, что могу быть дерзким и просто передатьследующий

pd.melt pd.melt(df,id_vars=[df.iloc[0]],value_vars=df.iloc[1] )

, но это привело к ошибке 'Series' objects are mutable, thus they cannot be hashed

Я посмотрел похожие ответы на pd.melt и, возможно, изменить илиUNPIVOT?но я теряюсь в том, как мне поступить.

любая помощь очень ценится.

Правка для Никсона:

Моя первая строка имеет мои уникальные идентификаторы

2-я строка содержит мое наблюдение, которое в данном случае является типом обзора (средний, нормальный)

3-я строка имеет переменные, назначенные вышеупомянутому наблюдению - давайте назовем эту оценку.

В 1-м столбце указаны мои даты, по которым набираются баллы по строкам.

1 Ответ

0 голосов
/ 28 ноября 2018

Альтернативой pd.melt является установка строк в качестве уровней столбцов мультииндекса, а затем stack их.Ваши метаданные будут храниться как индекс, а не как столбец.Не уверен, что это имеет значение.

df = pd.DataFrame([
    ['Date',     '0151',        '0561',       '0522',   '0912'],
    ['Date',     'AVG Review',  'AVG Review', 'Review', 'Review'],
    ['Date',     'NaN',         'NaN',        'NaN',    'NaN'],
    ['01/01/18', 2,             2.5,          4,        5],
])

df = df.set_index(0)
df.index.name = 'Date'
df.columns = pd.MultiIndex.from_arrays([df.iloc[0, :], df.iloc[1, :]], names=['ID', 'Review'])
df = df.drop(df.index[[0, 1, 2]])

df.stack('ID').stack('Review')

Вывод:

Date      ID    Review    
01/01/18  0151  AVG Review      2
          0522  Review          4
          0561  AVG Review    2.5
          0912  Review          5
dtype: object

Вы можете легко вернуть индекс в столбцы с помощью reset_index.

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