Преобразование кадра данных в Python - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь преобразовать фрейм данных pandas в новый формат.

У меня было два фрейма данных, которые я объединил. Новый фрейм данных содержит дубликаты записей, и я хочу преобразовать его так, чтобы каждая из этих дубликатов записи находилась в одной строке с дополнительными столбцами, которые содержат данные этого дублирования. Я пытался использовать .pivot, .pivot_table, .melt, .unstack, но безуспешно, чтобы добиться того, что я хочу.

Предполагая, что у меня есть фрейм данных d1:

d1 = pd.DataFrame({"Wall ID": ["E12", "E12", "E12", "C35", "C35", "C35"],
                  "Length": [15, 15, 15, 21, 21, 21],
                  "Station": ["A1", "A2", "A3", "A1", "A2", "A3"],
                  "Time": [20, 14, 26, 29, 14, 12]})
d1

enter image description here

Я хочу изменить его на кадр данных d2:

d2 = pd.DataFrame({"Wall ID": ["E12", "C35"],
                  "Length": [15, 21],
                  "A1": [20, 29],
                  "A2": [14, 14],
                  "A3": [26, 12]})
d2

enter image description here

Обратите внимание, что «Длина»всегда одинаковы для одного и того же «идентификатора стены».

Ответы [ 2 ]

4 голосов
/ 05 октября 2019

Если вы хотите иметь производительность, вы можете использовать groupby:

Groupby в два раза быстрее, чем сводная таблица.

setup

import pandas as pd

df = pd.DataFrame({"Wall ID": ["E12", "E12", "E12", "C35", "C35", "C35"],
                  "Length": [15, 15, 15, 21, 21, 21],
                  "Station": ["A1", "A2", "A3", "A1", "A2", "A3"],
                  "Time": [20, 14, 26, 29, 14, 12]})

df
  Wall ID  Length Station  Time
0     E12      15      A1    20
1     E12      15      A2    14
2     E12      15      A3    26
3     C35      21      A1    29
4     C35      21      A2    14
5     C35      21      A3    12

с использованием сводной таблицы

%%timeit
df.pivot_table("Time", ["Wall ID","Length"], "Station").reset_index()
7.83 ms ± 503 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

с использованием groupby

%%timeit

(df.groupby(["Wall ID", "Station","Length"]) # These are the indices we want
.agg({"Time": 'first'}) # We want to aggregatge Time, e.g. 'mean'
.unstack(level="Station") # Move Station to column section
.droplevel(0,axis=1) # Remove outermost multi-index of agg col 'Time'
.reset_index() # completely remove multi-index and make simple table
)
3.84 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

выход

Station Wall ID  Length  A1  A2  A3
0           C35      21  29  14  12
1           E12      15  20  14  26
2 голосов
/ 05 октября 2019

Использование pivot_table:

import pandas as pd

df = pd.DataFrame({"Wall ID": ["E12", "E12", "E12", "C35", "C35", "C35"],
                  "Length": [15, 15, 15, 21, 21, 21],
                  "Station": ["A1", "A2", "A3", "A1", "A2", "A3"],
                  "Time": [20, 14, 26, 29, 14, 12]})

new_df = df.pivot_table("Time", ["Wall ID","Length"], "Station").reset_index()

print (new_df)

#
Station Wall ID  Length  A1  A2  A3
0           C35      21  29  14  12
1           E12      15  20  14  26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...