Панды: взорвать элементы массива и группы? - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю в Pandas 0.23, у меня есть столбец массива и логический столбец.Я бы хотел сгруппировать по логическому и каждому отдельному элементу в массиве, чтобы найти значения true и false для каждого элемента.

Пример данных:

a = pd.DataFrame([
  {'vals': ['a,b,c'], 'succeeded': True},
  {'vals': ['a,b'], 'succeeded': False},
  {'vals': ['c'], 'succeeded': True},
  {'vals': ['b,d'], 'succeeded': False},
])

Желаемый вывод:

      succeeded_t     succeeded_f
a     1               1
b     1               2
c     2               0
d     0               1

Какой лучший способ сделать это?Нужно ли сначала "разбивать" элементы массива на строки, а затем группировать?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Возможно, вам придется сгладить ваш список, затем использовать crosstab, также ваш список не является списком, это один список элементов со строкой, вам нужно сначала разбить его на

a.vals=a.vals.map(lambda x : x[0].split(','))
newdf=pd.DataFrame({'succeeded':a['succeeded'].reindex(a.index.repeat(a.vals.str.len())),
                    'vals':np.concatenate(a['vals'].values)})
pd.crosstab(newdf['vals'],newdf['succeeded'])
Out[457]: 
succeeded  False  True 
vals                   
a              1      1
b              2      1
c              0      2
d              1      0
0 голосов
/ 17 сентября 2018

Возможно, вы можете сделать это за один раз, но просто поднабор для двух групп и использование str.get_dummies для каждого поднабора, а затем объединить результаты

import pandas as pd

pd.concat([a[a.succeeded].vals.str.get_dummies(sep=',').sum().to_frame('succeeded_t'),
           a[~a.succeeded].vals.str.get_dummies(sep=',').sum().to_frame('succeeded_f')], 
          axis=1, sort=True).fillna(0)

Выход:

   succeeded_t  succeeded_f
a          1.0          1.0
b          1.0          2.0
c          2.0          0.0
d          0.0          1.0

С другой стороны

Если в выводе будет много столбцов, которые вы не хотите объединять вручную:

(a.set_index('succeeded')
  .vals.str.get_dummies(sep=',')
  .groupby(level=0).sum().T
  .rename_axis(None, axis=1))

Выход:

   False  True 
a      1      1
b      2      1
c      0      2
d      1      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...