Фильтровать уникальные совпадения нескольких столбцов в фрейме данных с помощью Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я довольно новичок в pandas, и я пробовал несколько решений этой проблемы, используя логику dataframe.merge и lambda , но мне не удалось найти решение, которое последовательно приводит к тому, что я ищу. После фильтрации некоторых данных с помощью

 df = df.groupby(['0', '1']).size()
df = df.to_frame(name='2').reset_index()
  

Я получаю следующую таблицу, первые два столбца представляют начальную и конечную точки соответственно, а третий представляет количество раз, которое оно повторялось до groupby :

 0   1   2
a   d   8
b   h   7
c   f   3
c   e   3
d   a   2
b   b   2
e   c   1
f   c   1
g   i   1
h   b   1
i   g   1
  

Мне нужно учитывать как начальные, так и конечные точки> start, что означает, что следующий фрейм данных:

 0   1   2
a   d   8
d   a   2
  

должно закончиться так:

 0   1   2
a   d   10
  

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

 0   1   2
a   d   10
b   h   8
c   f   4
c   e   4
b   b   2
g   i   2
  

Я уверен, что это должно быть простым решением, но, хоть убейте, я просто не могу точно определить ответ.

Ответ №1:

Вы можете сделать это следующим образом:

 df1 = df[['0', '1']].apply(sorted, 1, result_type = "expand").rename(columns = {0:'col1', 1:'col2'})
    
result = df.groupby([df1.col1, df1.col2]).sum().reset_index()
  

Комментарии:

1. Привет! Это тоже работает! Мне также было легче понять (или, по крайней мере, мне хотелось бы так думать), также как и ответ Андерсона, это не фильтровало бы, если бы они были int вместе с str записями. Я мог бы легко исправить это, добавив astype(str) вот так: df1 = result_co[['Connector 1', 'Connector 2']].astype(str).apply(sorted, 1, result_type="expand").rename(columns={0: 'col1', 1: 'col2'})

2. Рад, что это помогло!

Ответ №2:

Один из вариантов — использовать apply для сортировки значений в столбцах, затем выполнить другой groupby (обратите внимание, что имена ваших столбцов могут отличаться, мое df было сделано с использованием pd.read_clipboard() )

 df.reset_index(inplace=True)

df[['0','1']]=df[['0','1']].apply(lambda x:sorted(x),axis=1).tolist()

df

    0   1   2
0   a   d   8
1   b   h   7
2   c   f   3
3   c   e   3
4   a   d   2
5   b   b   2
6   c   e   1
7   c   f   1
8   g   i   1
9   b   h   1
10  g   i   1

df.groupby(['0','1'], as_index=False).sum()

    0   1   2
0   a   d   10
1   b   b   2
2   b   h   8
3   c   e   4
4   c   f   4
5   g   i   2
  

Комментарии:

1. Извините, если ответ занял некоторое время. Это действительно сработало! однако я столкнулся с небольшой проблемой, если есть какие-либо записи с номером (который pandas читает как int ), он не будет фильтроваться. Скажем, вместо a -> d это 18 -> b или иногда это может переходить от числа к числу, например 15 -> 4.