Есть ли способ растопить фрейм данных таким образом, чтобы столбцы значений создавались отдельно на основе типа данных? (используя питон) - PullRequest
2 голосов
/ 11 июня 2019

У меня есть фрейм данных, который имеет сотни столбцов, которые должны быть представлены в желаемом формате, я применил плавление, что неудовлетворительно. Функция melt создает столбец значений и добавляет все значения столбца, назначенные параметру «value_vars», независимо от типа данных. Я пытаюсь получить отдельные столбцы значений в зависимости от типа данных.

Фрейм данных, который у меня есть:

время место Температура значение1 Значение давления2

2/4/2018 U.K A 3 C 2

3/4/2018 U.K C 4 D 6

4/4/2018 U.K B 6 A 1

5/4/2018 U.K D 8 A 4

Ожидаемый результат:

Значение источника параметра времени места

2/4/18 U.K Температура A 3

3/4/18 U.K Температура C 4

4/4/18 U.K Температура B 6

5/4/18 U.K Температура D 8

2/4/18 U.K Давление C 2

3/4/18 U.K Давление D 6

4/4/18 U.K Давление A 1

5/4/18 U.K Давление A 4

Заранее спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

Используйте DataFrame.select_dtypes для получения столбцов по типам, измените форму на stack и объедините concat:

df = df.reset_index(drop=True)

df1 = df.set_index(['time','place'], append=True)
a = df1.select_dtypes(object).stack().rename('source').reset_index(level=3)
b = df1.select_dtypes(np.number).stack().rename('value').reset_index(level=3, drop=True)
df2 = (pd.concat([a, b], axis=1)
         .reset_index(level=[1,2])
         .rename(columns={'level_3':'parameter'})
         .sort_values(['place','parameter'])
         .reset_index(drop=True)
         )

print (df2)
       time place    parameter source  value
0  2/4/2018   U.K     Pressure      C      2
1  3/4/2018   U.K     Pressure      D      6
2  4/4/2018   U.K     Pressure      A      1
3  5/4/2018   U.K     Pressure      A      4
4  2/4/2018   U.K  Temperature      A      3
5  3/4/2018   U.K  Temperature      C      4
6  4/4/2018   U.K  Temperature      B      6
7  5/4/2018   U.K  Temperature      D      8

Другое решение для выбранной пары и непарного столбца после первых 2 столбцов:

df = df.reset_index(drop=True)

df1 = df.set_index(['time','place'], append=True)
a = df1.iloc[:, ::2].stack().rename('source').reset_index(level=3)
b = df1.iloc[:, 1::2].stack().rename('value').reset_index(level=3, drop=True)

df2 = (pd.concat([a, b], axis=1)
         .reset_index(level=[1,2])
         .rename(columns={'level_3':'parameter'})
         .sort_values(['place','parameter'])
         .reset_index(drop=True)
         )

print (df2)
       time place    parameter source  value
0  2/4/2018   U.K     Pressure      C      2
1  3/4/2018   U.K     Pressure      D      6
2  4/4/2018   U.K     Pressure      A      1
3  5/4/2018   U.K     Pressure      A      4
4  2/4/2018   U.K  Temperature      A      3
5  3/4/2018   U.K  Temperature      C      4
6  4/4/2018   U.K  Temperature      B      6
7  5/4/2018   U.K  Temperature      D      8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...