Расширенный сводный стол в Pandas - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь оптимизировать некоторые скрипты преобразования таблиц в Python Pandas, которые я пытаюсь передать огромными наборами данных (более 50 тыс. Строк).Я написал скрипт, который просматривает каждый индекс и анализирует значения в новом фрейме данных (см. Пример ниже), но у меня возникают проблемы с производительностью.Есть ли какая-нибудь функция панд, которая могла бы получить те же результаты без итерации?

Пример кода:

from datetime import datetime
import pandas as pd

date1 = datetime(2019,1,1)
date2 = datetime(2019,1,2)

df = pd.DataFrame({"ID": [1,1,2,2,3,3],
                  "date": [date1,date2,date1,date2,date1,date2],
                  "x": [1,2,3,4,5,6],
                  "y": ["a","a","b","b","c","c"]})


new_df = pd.DataFrame()
for i in df.index:

    new_df.at[df.at[i, "ID"], "y"] = df.at[i, "y"]

    if df.at[i, "date"] == datetime(2019,1,1):
        new_df.at[df.at[i, "ID"], "x1"] = df.at[i, "x"]
    elif df.at[i, "date"] == datetime(2019,1,2):
        new_df.at[df.at[i, "ID"], "x2"] = df.at[i, "x"]

output:

   ID       date  x  y
0   1 2019-01-01  1  a
1   1 2019-01-02  2  a
2   2 2019-01-01  3  b
3   2 2019-01-02  4  b
4   3 2019-01-01  5  c
5   3 2019-01-02  6  c

   y   x1   x2
1  a  1.0  2.0
2  b  3.0  4.0
3  c  5.0  6.0

Преобразование в основном группирует строкипо столбцу «ID» и получает значения «x1» из строк с датой 2019-01-01 и значения «x2» из строк с датой 2019-01-02.Значение «y» одинаково в пределах одного и того же «ID».Столбцы «ID» становятся новыми индексами.

Буду признателен за любые советы по этому вопросу.

1 Ответ

0 голосов
/ 07 марта 2019

Используя pivot_tables, вы получите то, что ищете:

result = df.pivot_table(index=['ID', 'y'], columns='date', values='x')
result.rename(columns={date1: 'x1', date2: 'x2'}).reset_index('y')
...