Суммируйте метки категориальных объектов по столбцам для данной строки, панд - PullRequest
0 голосов
/ 19 мая 2018

Каким будет питонный способ суммирования (одинакового) количества меток категориальных переменных для каждого экземпляра в df?Например:

qualityOfLife_df = pd.DataFrame([['A', 'Up', 'Up', 'Same'], 
                               ['B', 'Up', 'Down', 'Up'],
                                ['C', 'Down', 'Down', 'Down']],
                               columns = ['City', 'Crime', 'Pollution', 'Jobs'])

должен дать, после добавления в метку количество столбцов:

  City Crime Pollution  Jobs  nUp  nDown  nSame
0    A    Up        Up  Same    2      0      1
1    B    Up      Down    Up    2      1      0
2    C  Down      Down  Down    0      3      0

Спасибо

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

В качестве альтернативы можно использовать фиктивные переменные для каждого столбца, а затем взять их сумму:

pd.get_dummies(qualityOfLife_df.loc[:, 'Crime':'Jobs']).groupby(lambda x: x.split('_')[1], axis=1).sum()
Out: 
   Down  Same  Up
0     0     1   2
1     1     0   2
2     3     0   0

Я ожидаю, что это будет более эффективно, если у вас большое количество строк.

0 голосов
/ 19 мая 2018

Вы можете использовать collections.Counter из стандартной библиотеки:

from collections import Counter

counts = pd.DataFrame(df[['Crime', 'Pollution', 'Jobs']].apply(Counter, axis=1).tolist())\
           .fillna(0).astype(int)

df = df.join(counts)

print(df)

  City Crime Pollution  Jobs  Down  Same  Up
0    A    Up        Up  Same     0     1   2
1    B    Up      Down    Up     1     0   2
2    C  Down      Down  Down     3     0   0
0 голосов
/ 19 мая 2018

Вы можете применить функцию pd.Series.value_counts к каждой строке, а затем после замены nan s на ноль объединить счетчики ко второй оси вашего dataframe.

>>> counts = qualityOfLife_df.apply(pd.Series.value_counts, axis=1)[['Up', 'Down', 'Same']].fillna(0)
>>> pd.concat((qualityOfLife_df, counts), axis=1)
  City Crime Pollution  Jobs   Up  Down  Same
0    A    Up        Up  Same  2.0   0.0   1.0
1    B    Up      Down    Up  2.0   1.0   0.0
2    C  Down      Down  Down  0.0   3.0   0.0

Также, как уже упоминалосьв комментарии вы можете использовать astype(int) для преобразования чисел с плавающей точкой в ​​целое число.Что бы я порекомендовал, для оптимизации памяти, если вы имеете дело с большими наборами данных, используйте меньший целочисленный тип, такой как np.int16 или np.int8, в зависимости от максимального числа, которое может содержать счет.

>>> pd.concat((qualityOfLife_df, counts.astype(int)), axis=1)
  City Crime Pollution  Jobs  Up  Down  Same
0    A    Up        Up  Same   2     0     1
1    B    Up      Down    Up   2     1     0
2    C  Down      Down  Down   0     3     0
...