Pandas groupby-apply: не может переиндексировать с дублированной оси - PullRequest
3 голосов
/ 16 марта 2019

Я выполняю групповую операцию над кадром данных.В каждой группе я должен переименовать два столбца и удалить один, чтобы каждая группа имела следующую форму:

index(timestamp) | column-x | column-y
...              |  ....    | ..... 

Индекс является меткой времени, и он будет общим для каждой группы.«column-x» и «column-y» будут отличаться для каждой группы.Моя цель состоит в том, чтобы затем объединить все группы в индексе, чтобы у меня был уникальный DataFrame, такой как:

index(timestamp) | column-x1 | column-y1 | column-x2 | column-y2 | ...
...              |  .....    | ......    |  .......  | .......   | ...

Функция, которую я применяю к каждой группе: (Могу ли я выполнить редактирование на месте для группы во время итерации?):

def process_ssp(df_ssp):
    sensor_name = df_ssp.iloc[0]['subsystem-sensor-parameter'] # to be used as column name
    df_ssp.rename(columns = {
        'value_raw': '%s_raw' % sensor_name,
        'value_hrf': '%s_hrf' % sensor_name,
    }, inplace = True)
    df_ssp.drop('subsystem-sensor-parameter', axis='columns', inplace=True) # since this is the column I am grouping on I guess this isn't the right thing to do?
    return df_ssp

Затем я вызываю:

res = df_node.groupby('subsystem-sensor-parameter', as_index=False).apply(process_ssp)

, что приводит к ошибке:

ValueError: cannot reindex from a duplicate axis

РЕДАКТИРОВАТЬ: выборка набора данных https://drive.google.com/file/d/1RvPE1t3BmjeaqCNkVqGwmokCFQQp77n8/view?usp=sharing

Ответы [ 2 ]

1 голос
/ 21 июля 2019

Я могу успешно применить ваш код и создать желаемый вывод, перебирая группы, а не используя apply:

import pandas as pd
df = pd.read_csv('/Users/jeffmayse/Downloads/sample.csv')
df.set_index('timestamp', inplace=True)

def process_ssp(df_ssp):
    sensor_name = df_ssp.iloc[0]['subsystem-sensor-parameter'] # to be used as column name
    df_ssp.rename(columns = {
        'value_raw': '%s_raw' % sensor_name,
        'value_hrf': '%s_hrf' % sensor_name,
    }, inplace = True)
    df_ssp.drop('subsystem-sensor-parameter', axis='columns', inplace=True) # since this is the column I am grouping on I guess this isn't the right thing to do?
    return df_ssp

groups = df.groupby('subsystem-sensor-parameter')
out = []
for name, group in groups:
    try:
        out.append(process_ssp(group))
    except:
        print(name)
pd.concat(out).shape

Out[7]: (16131, 114)

И на самом деле проблема заключается в apply метод, поскольку ваша функция не нужна для выдачи ошибки:

df.groupby('subsystem-sensor-parameter', as_index=False).apply(lambda x: x)

также оценивается как ValueError: cannot reindex from a duplicate axis.

Однако это утверждение оценивается какожидал:

df.reset_index(inplace=True)
df.groupby('subsystem-sensor-parameter', as_index=False).apply(process_ssp)

Out[22]: 
      nc-devices-alphasense_hrf  ... wagman-uptime-uptime_raw
0                             0  ...                      NaN
1                           NaN  ...                      NaN
2                           NaN  ...                      NaN
3                           NaN  ...                      NaN
...

Проблема в том, что у вас есть DatetimeIndex с дублирующимися значениями..apply пытается объединить наборы результатов вместе, но не уверен, как объединить индекс с дублирующимися значениями.По крайней мере, я верю, что это так.Сбросьте свой индекс и попробуйте снова.

Редактировать: чтобы расширить, вы часто видите эту ошибку при попытке переиндексировать DatetimeIndex, т. Е. У вас есть почасовой индекс и вы хотите преобразовать его во второй индекс разрешения или обычно заполняетев пропущенные часы.Вы используете переиндексацию, но она потерпит неудачу, если в вашем индексе есть повторяющиеся значения.Я думаю, это то, что происходит здесь: кадры данных, создаваемые применяемой функцией, имеют дублирующиеся значения индекса, и ошибка возникает из-за попытки вывести выходные данные путем вызова reindex для DatetimeIndex с дубликатами.Сброс индекса работает, потому что ваш индекс теперь все уникален, а столбец timestamp не важен для этой операции.

1 голос
/ 17 марта 2019

Вы можете сначала добавить столбец subsystem-sensor-parameter для MultiIndex, изменить его на unstack, отсортировать MultiIndex в столбцах по второму уровню и изменить их позиции. Последнее преобразование MultiIndex путем выравнивания с map и join:

res = (df_node.set_index('subsystem-sensor-parameter', append=True)
                          .unstack()
                          .sort_index(axis=1, level=1)
                          .swaplevel(0,1, axis=1)) 
res.columns = res.columns.map('_'.join)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...