панды объединяют строки / групповые данные с категориальными данными и множеством значений нан - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь упростить структуру данных, объединяя строки на основе 2 столбцов. Теперь, все остальное немного запутанно с большим количеством значений nan и тому подобным. Я покажу пример:

начальный:

    Name    Sex     Shoes       Bike          Car
0   John    Male             Specialised    
1   John    Male             Bridgestone    
2   Lucy    Female                            BMW
3   John    Male    Vans        
4   Lucy    Female  Nike    

target:

    Name    Sex     Shoes   Bike                        Car
0   John    Male    Vans    Specialised, Bridgestone    
1   Lucy    Female  Nike                                BMW

Какую функцию я должен использовать? Я не мог понять, как это сделать с groupby и .agg (','. Join) добавление ...

(данные вышетолько для примера - у того, с которым мне приходится работать, гораздо больше строк со множеством вхождений с одинаковыми именами и около 20 столбцов «категории» ... также обратите внимание, что в каждой строке должна быть строка только в одной из «категорий» -обувь / велосипед / автомобиль и т.д.)

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Вы можете fillna с пустой строкой, а затем очистить неверные данные в конце.


u = df.fillna('').groupby(['Name', 'Sex']).agg(', '.join)
u.stack().str.replace('(, ){2,}|^, |, $', '').unstack()

            Shoes                      Bike  Car
Name Sex
John Male    Vans  Specialised, Bridgestone
Lucy Female  Nike                            BMW

Порядок регулярного выражения очень важно

0 голосов
/ 16 октября 2019

Предположим, что пустые ячейки имеют значение NaN (не пустая строка), результат будет достигнут следующим:

(df.set_index(['Name','Sex']) 
   .groupby(level=[0,1])
   .apply(lambda x:x.apply(lambda y: ', '.join(y.dropna())))
   .reset_index())

Второй подход,

(df.set_index(['Name','Sex'])
   .stack()
   .groupby(level=[0,1,2])
   .apply(', '.join)
   .unstack()
   .reset_index()
0 голосов
/ 16 октября 2019

вы можете использовать это с помощью группы, как показано ниже

df = pd.DataFrame([['John', 'Male', 'na', 'Specialised', 'na'], ['John', 'Male', 'na', 'Bridgestone', 'na'], ['Lucy', 'Female', 'na', 'na', 'BMW'], ['John', 'Male', 'Vans', 'na', 'na'], ['Lucy', 'Female', 'Nike', 'na', 'na']], columns=('Name', 'Sex', 'Shoes', 'Bike', 'Car'))
df = df.mask(df == "na", '')

df.groupby(["Name", "Sex"]).agg(lambda row: ",".
                                join([val for val in row if val.strip()!=""]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...