Python - проверить несколько столбцов и сравнить строку - PullRequest
0 голосов
/ 26 июня 2018

Допустим, у меня есть датафрейм ниже.

       a        b        c
0    one      two    three
1  three      one      two

Я хочу, чтобы строки 0 и 1 рассматривались как один и тот же список? или что-то еще, поскольку обе строки содержат «один», «два», «три», хотя порядок отличается.

Должен ли я создать новый столбец, в котором хранятся все строки из столбцов a, b, c, например,

       a        b        c                d
0    one      two    three    one two three
1  three      one      two    three one two

, а затем сравните строки 0 и 1 столбца d?

После этого я хочу сделать .groupby ('d'), и в результате 'один два три' и 'три ​​один два' не должны быть разделены.

Я не могу придумать, как решить эту проблему, и мне нужна помощь.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

сортировка ячеек в каждой строке перед объединением для создания строки группировки.

используйте apply с axis = 1 для применения этой функции построчно.

df['d'] = df.apply(lambda x: ' '.join(x.sort_values()), axis=1)

# outputs:

       a    b      c              d
0    one  two  three  one three two
1  three  one    two  one three two
Группировка

по d поместит обе строки в одну группу. Пример:

df.groupby('d').agg('count')

               a  b  c
d
one three two  2  2  2
0 голосов
/ 26 июня 2018

Новый столбец, который вы создаете, должен быть tuple, так как списки не могут быть хешируемыми (groupby потерпит неудачу). Таким образом, мы сначала создаем столбец с tolist(), затем сортируем его и transform получаем tuple.

Настройка

import pandas as pd

data = {'a': ['one', 'three'], 'b': ['two', 'one'], 'c': ['three', 'two']}
df = pd.DataFrame(data)

Сортировка и преобразование ...

df['d'] = df.values.tolist()
df['d'] = (    
     df['d'].transform(sorted)
         .transform(tuple)
)
print(df.groupby('d').sum()) # I'm calling sum() just to show groupby working 

# prints only one group:
#                           a       b         c
# d
# (one, three, two)  onethree  twoone  threetwo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...