Найти уникальные значения в ячейке данных Pandas - PullRequest
0 голосов
/ 30 января 2019

Пример DF

data = {'name': ['Jason , Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
        'year': ['2012 , 2012 , 2016 , 2016', 2012, 2013, 2014, 2014], 
        'reports': ['4 , 4 , 5 , 6 , 6 , 7', 24, 31, 2, 3]}
df1 = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])

Похоже :

                     name            ...                                   year
Cochice     Jason , Jason            ...              2012 , 2012 , 2016 , 2016
Pima                Molly            ...                                   2012
Santa Cruz           Tina            ...                                   2013
Maricopa             Jake            ...                                   2014
Yuma                  Amy            ...                                   2014

Я хочу уникальное значение для каждой ячейки индекса Cochice,Я пробовал drop_duplicates и nunique, но ни один из них не работает.

В моем оригинальном df число столбцов может быть больше 3

Выход Df

             name  reports       year
Cochice     Jason  4,5,6,7  2012,2016
Pima        Molly       24       2012
Santa Cruz   Tina       31       2013
Maricopa     Jake        2       2014
Yuma          Amy        3       2014

1 Ответ

0 голосов
/ 30 января 2019

Я не знаю ни о какой встроенной функции Pandas, которая может это сделать, поэтому придумала решение, использующее applymap и пользовательскую функцию, которая разделяет запятые, удаляет пробелы и объединяет уникальные элементыв одну строку.Это не красиво и, вероятно, не очень эффективно, но оно должно работать:

In [15]: df1.applymap(lambda x: x if ',' not in str(x) else ','.join(sorted(set(y.strip() for y in(x.split(','))))))
Out[15]: 
             name  reports       year
Cochice     Jason  4,5,6,7  2012,2016
Pima        Molly       24       2012
Santa Cruz   Tina       31       2013
Maricopa     Jake        2       2014
Yuma          Amy        3       2014

Изменить, чтобы показать применение только к определенному индексу, а не ко всем строкам:

df1.loc[['Cochice']].applymap(lambda x: x if ',' not in str(x) else ','.join(sorted(set(y.strip() for y in(x.split(','))))))
Out[24]: 
          name  reports       year
Cochice  Jason  4,5,6,7  2012,2016
...