Столбцы панд к массивам - PullRequest
0 голосов
/ 14 октября 2018

У меня есть следующий фрейм данных:

    name        day       value     time
0   MAC000002   2012-12-16  0.147   09:30:00
1   MAC000002   2012-12-16  0.110   10:00:00
2   MAC000002   2012-12-16  0.736   10:30:00
3   MAC000003   2012-12-16  0.404   09:30:00
4   MAC000003   2012-12-16  0.845   10:00:00

Я хочу преобразовать значения только в пустой массив:

[[0.147, 0.110, 0.736],[0.404, 0.845 ...],...]

Единственный способ, которым я могу думать, это сделатьПоверните фрейм данных, затем выведите значения:

new_df = pd.pivot_table(df,index=["name"],values=["value"])
data = new_df.values()

Однако набор данных очень большой и содержит тысячи уникальных имен, и я не могу повернуть таблицу из-за ограничений памяти.Есть ли другой способ вывести значения, сгруппированные по имени, сохраняя день, затем упорядочив время?

1 Ответ

0 голосов
/ 14 октября 2018

Возможно, вы идете по неверному пути:

  • pd.pivot_table не даст вам того, что вы хотите, по умолчанию он дает среднее по группам.Хотя вы хотите сохранить все значения.
  • Массивы NumPy дают только большие преимущества для фиксированных измерений, например, одинаковое количество столбцов для каждой строки.Здесь кажется, что это может быть неверно: одна группа может иметь 2 значения, а другая 3. Список списков может быть более подходящим.

Я предполагаю, что вы уже отсортировали свой фрейм данныхпо дате и времени.Тогда одним из решений является использование GroupBy + apply с list:

res = df.groupby('name', sort=False)['value'].apply(list).values.tolist()

print(res)

[[0.147, 0.11, 0.736], [0.40399999999999997, 0.845]]

Вы можете увидеть некоторое улучшение производительности, преобразовав 'name' в категориальную .Другое решение возможно через collections.defaultdict, но это, вероятно, будет медленнее:

from collections import defaultdict

def group_apply(df):
    return df.groupby('name', sort=False)['value'].apply(list).values.tolist()

def group_dict(df):
    dd = defaultdict(list)
    for name, value in df[['name', 'value']].itertuples(index=False):
        dd[name].append(value)
    return list(dd.values())

df = pd.concat([df]*10000, ignore_index=True)

assert group_apply(df) == group_dict(df)

%timeit group_apply(df)  # 8.07 ms
%timeit group_dict(df)   # 39.1 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...