Преобразовать кадр данных без зацикливания? - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы проанализировать и преобразовать следующий DataFrame

import random
import string
import numpy as np
import pandas as pd

# generate example dataframe
df=pd.DataFrame()
df['Name']=[str(x) for x in np.random.choice(['a','b','c'],10)]
df['Cat1']=[str(x) for x in np.random.choice(['x',''],10)]
df['Cat2']=[str(x) for x in np.random.choice(['x',''],10)]
df['Cat3']=[str(x) for x in np.random.choice(['x',''],10)]

df.head(10)

Это создает DataFrame следующим образом:

Пример DataFrame

задача состоит в том, чтобы посчитать 'x' в столбцах Cat1, Cat2, Cat3 для каждой уникальной записи в столбце 'Name'.Это может быть достигнуто с помощью функции groupby ():

grouped=df.groupby(['Name'])
dfg=grouped['Cat1','Cat2','Cat3'].sum()
dfg

Результат анализа

И результат - это почти то, что я хотел.Теперь мне нужно было заменить «x» на число, например, «xxxx» на 4, «x» на 1 и так далее.В решении используется цикл по всем столбцам:

for col in range(0,len(dfg.columns)):
    dfg[dfg.columns[col]]=list(map(lambda x: len(x), dfg[dfg.columns[col]]))
dfg

Конечный результат.

Теперь мне интересно, как мне избежать этого цикла и достичь того же конечного результата?
Большое спасибо за то, что поделились своими идеями и рекомендациями.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В зависимости от вашего источника данных это можно легко решить, заменив «x» на 1 и установив пустые ячейки в 0. Таким образом, вам также пришлось изменить тип данных столбца на целое.

Позвонив по номеру sum(), тогда ваша группа уже даст вам числовой ответ.

0 голосов
/ 04 декабря 2018

Попробуйте:

df.set_index('Name').eq('x')\
  .groupby('Name')['Cat1','Cat2','Cat3'].sum()\
  .astype(int).reset_index()

Вывод:

  Name  Cat1  Cat2  Cat3
0    a     5     3     4
1    b     1     1     0
2    c     1     1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...