Функция на строках датафреймов для уменьшения дублирующихся пар Python - PullRequest
3 голосов
/ 08 мая 2019

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

0     1      2      3       4       5       6       7      8     9     10     11
12    13     13     13.4    13.4    12.4    12.4    16     0     0     0      0
14    12.2   12.2   13.4    13.4    12.6    12.6    19     5     5     6.7    6.7
.
.
.

В каждом «слое» / строке есть пары, которые являются дубликатами, которые я хочу уменьшить.

Единственная проблема состоит в том, что также есть повторяющиеся нули, поэтому я не могу просто удалить дубликаты в строке, иначе будет оставлено неравное количество строк.

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

0     1      2      3       4       5      6 
12    13     13.4   12.4    16      0      0
14    12.2   13.4   12.6    19      5      6.7
.
.
.

Есть ли простая функция, которую я мог бы написать для этого?

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Метод 1 с использованием transpose

Как упомянул Юка в комментариях:

df = df.T.drop_duplicates().T
df.columns = range(len(df.columns))

print(df)
      0     1     2     3     4    5    6
0  12.0  13.0  13.4  12.4  16.0  0.0  0.0
1  14.0  12.2  13.4  12.6  19.0  5.0  6.7

Метод 2 с использованием list comprehension с четными числами

Мы можем составить список из даже чисел и затем выбрать эти столбцы на основе их индекса:

idxcols = [x-1 for x in range(len(df.columns)) if x % 2]

df = df.iloc[:, idxcols]

df.columns = range(len(df.columns))

print(df)
    0     1     2     3  4    5
0  12  13.0  13.4  12.4  0  0.0
1  14  12.2  13.4  12.6  5  6.7
1 голос
/ 08 мая 2019

В вашем случае

from itertools import zip_longest
l=[sorted(set(x), key=x.index) for x in df.values.tolist()]
newdf=pd.DataFrame(l).ffill(1)
newdf
Out[177]: 
      0     1     2     3     4    5    6
0  12.0  13.0  13.4  12.4  16.0  0.0  0.0
1  14.0  12.2  13.4  12.6  19.0  5.0  6.7
0 голосов
/ 08 мая 2019

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

from functools import reduce
output_df = reduce(
    lambda d, c: d if (d.iloc[:,-1] == df[c]).all() else pd.concat([d, df[c]], axis=1),
    df.columns[1:],
    df[df.columns[0]].to_frame()
)
print(output_frame)
#    0     1     3     5   7  8   10
#0  12  13.0  13.4  12.4  16  0  0.0
#1  14  12.2  13.4  12.6  19  5  6.7

Этот метод также поддерживает имена столбцов столбцов, которыебыли выбраны, если это важно.

Предполагая, что это ваш ввод df:

print(df)
#    0     1     2     3     4     5     6   7  8  9   10   11
#0  12  13.0  13.0  13.4  13.4  12.4  12.4  16  0  0  0.0  0.0
#1  14  12.2  12.2  13.4  13.4  12.6  12.6  19  5  5  6.7  6.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...