Сокращение повторяющихся значений в фрейме данных парами в Python - PullRequest
4 голосов
/ 10 мая 2019

У меня есть кадр данных, который выглядит следующим образом:

df_pairs

128.437     128.437     121.639  5100.9     5029.08   5029.08   4888.81  4888.81    0         0         0    0   0   0
129.588     129.588     122.79   5102.05    5030.24   5030.24   4959.55  4959.55    4889.96   4889.96   0    0   0   0

Я хотел бы сохранить все уникальные значения в каждой строке и уменьшить каждое повторяющееся значение только до 1 из парных значений.

Вывод будет:

df_unique

128.437     121.639  5100.9   5029.08    4888.81    0          0   0
129.588     122.79   5102.05  5030.24    4959.55    4889.96    0   0

Итак, как вы можете видеть, теперь у каждой строки есть пара / 2, если эта пара равна.

Псевдокод будет выглядеть примерно так:

df_unique = pd.DataFrame(columns=df_pairs.columns)

for columns in range(len(df_pairs.columns)):

     if df_pairs.iloc[row_element] == df_pairs.iloc[row_element+1]:

             unique_element = df_pairs.iloc[row_element]
             df_unique[new_row_element] = unique_element

Есть ли способ сделать это быстро, без итерации по каждой строке каждой пары по элементам?

Я не могу просто удалить все дубликаты с df.drop_duplicates() из-за того факта, что могут быть повторениязначения в строках, которые не обязательно являются соседними парами, а также тот факт, что есть 0, которые я хочу сохранить в уникальных парах, если они встречаются.

1 Ответ

5 голосов
/ 10 мая 2019

Попробуйте это:

(df.groupby(df.ne(df.shift(axis=1)).all(axis=0).cumsum(), 
            axis=1)
 .apply(lambda x: x.drop(x.columns[1::2], axis=1))
 .dropna(axis=1)
)

Выход:

          0        2        3        4        6        8    10    12
--  -------  -------  -------  -------  -------  -------  ----  ----
 0  128.437  121.639  5100.9   5029.08  4888.81     0        0     0
 1  129.588  122.79   5102.05  5030.24  4959.55  4889.96     0     0
...