Агрегируйте симметричные c пары, если они существуют в Pandas - PullRequest
0 голосов
/ 24 февраля 2020

С учетом кадра данных

data = {
        "col1": ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
        "col2": ['B', 'C', 'A', 'C', 'D', 'B', 'E', 'A',],
        "count": [3, 7, 12, 2, 8, 2, 5, 9]
        }
df = pd.DataFrame(data=data)

col1 col2 count
 A    B     3
 A    C     7
 B    A     12
 B    C     2
 C    D     8
 C    B     2
 D    E     5
 D    A     9

Я хочу объединить все строки, которые имеют симметричные пары c, с сохранением строк, которые этого не делают. Таким образом, результатом будет новый фрейм данных

col1 col2 count
 A    B     15
 A    C     7
 B    C     4
 C    D     8
 D    E     5
 D    A     9

Я рассмотрел Совокупная симметрия c пар pandas и Быстрый поиск симметричных c пар в numpy но ни один из них особо мне не помогает.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

На самом деле, данная ссылка использовала apply, что обычно медленно. Вот решение с np.sort:

s = np.sort(df[['col1','col2']], axis=1)
df.groupby([s[:,0],s[:,1]])['count'].sum().reset_index()

Вывод:

  level_0 level_1  count
0       A       B     15
1       A       C      7
2       A       D      9
3       B       C      4
4       C       D      8
5       D       E      5
2 голосов
/ 25 февраля 2020

Некоторые небольшие модификации ответа , на который вы ссылались делает то, что вы хотите:

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

df.groupby([df1.col1, df1.col2]).sum().reset_index()

  col1 col2  count
0    A    B     15
1    A    C      7
2    A    D      9
3    B    C      4
4    C    D      8
5    D    E      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...