Свертывание нескольких строковых столбцов по id - python - PullRequest
0 голосов
/ 07 мая 2018

Я получил следующий фрейм данных в Python:

d = pd.DataFrame({'id': [1, 1, 1, 2, 2, 3],
              'col1': ['normal', 'well', 'normal', 'normal', 'well', 'normal'],
              'col2': ['bad', 'normal','normal', 'normal', 'normal', 'bad']})

Я бы хотел свернуть по id, но оставить в столбцах строки, отличные от 'normal' или 'normal', если больше ничего нет ('хорошо' или 'плохо'). Примерно так:

result = pd.DataFrame({'id': [1, 2, 3],
                'col1': ['well', 'well', 'normal'],
                'col2': ['bad', 'normal', 'bad']})

Я думал о сортировке, а затем об использовании groupby и .first, но не знал, как получить желаемые уровни вверху в каждом столбце.

Ответы [ 3 ]

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

Используйте Категориальный, чтобы определить порядок

cats = ['well', 'bad', 'normal']
d = d.assign(
    col1=pd.Categorical(d.col1, cats, ordered=True),
    col2=pd.Categorical(d.col2, cats, ordered=True)
)

d.groupby('id', as_index=False).min()

   id    col1    col2
0   1    well     bad
1   2    well  normal
2   3  normal     bad
0 голосов
/ 07 мая 2018

Создаем вспомогательный ключ для помощи в сортировке, тогда мы делаем groupby

helpkey={'well':1,'bad':2,'normal':3}

s=d.set_index('id').groupby('id')[['col1','col2']].apply(lambda x : x.apply(lambda y: sorted(y,key=helpkey.get)))

# using all for find the row only have normal ,then we drop it.
s[~(s=='normal').all(1)].reset_index()

Out[568]: 
   id    col1    col2
0   1    well     bad
1   2    well  normal
2   3  normal     bad
0 голосов
/ 07 мая 2018

Используйте replace сначала NaN с, если нет значений NaN с до GroupBy.first:

d = d.replace('normal', np.nan).groupby('id').first().fillna('normal')
#alternative solution
d = d.mask(d == 'normal').groupby('id').first().fillna('normal')

print (d)
      col1    col2
id                
1     well     bad
2     well  normal
3   normal     bad
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...