Панды, как назначить идентификатор группы для групп, размеры которых> 1 - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу сделать groupby для df, а затем назначить каждой группе идентификатор, размер которого> 1;

df_gr = df.groupby(['a', 'b', 'c'])

df_filtered = df_gr.filter(lambda x: len(x) > 1)

if df_filtered.shape[0] == 0:
   df_filtered['id'] = -1
else:
   # put ids in df_filtered

Мне интересно, как это сделать.

a    b        c        d      
10   2017     20.0     231    
10   2017     20.0     223    
20   2018     10.0     113    
30   2017     11.0     134    
30   2017     11.0     112    
30   2017     11.0     111    

результат df,

 a    b        c        d      id
10   2017     20.0     231     1
10   2017     20.0     223     1
30   2017     11.0     134     2
30   2017     11.0     112     2
30   2017     11.0     111     2

if df_filtered.shape[0] != 0:
   df_filtered["id"] = df_filtered.groupby(
                ['a', 'b', 'c']).grouper.group_info[0]

1 Ответ

0 голосов
/ 25 апреля 2018

Я думаю, что нужно transform с numpy.where:

df['id'] = np.where(df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1, -1, 2)
print (df)
    a     b     c    d  id
0  10  2017  20.0  231  -1
1  10  2017  20.0  223  -1
2  20  2018  10.0  113   2
3  30  2017  11.0  134  -1
4  30  2017  11.0  112  -1
5  30  2017  11.0  111  -1

Если хотите значения 1 и 0, другое решение - привести логическую маску к integer s:

df['id'] = np.where(df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1, 1, 0)
df['id'] = (df.groupby(['a', 'b', 'c'])['a'].transform('size') > 1).astype(int)
print (df)
    a     b     c    d  id
0  10  2017  20.0  231   1
1  10  2017  20.0  223   1
2  20  2018  10.0  113   0
3  30  2017  11.0  134   1
4  30  2017  11.0  112   1
5  30  2017  11.0  111   1

РЕДАКТИРОВАТЬ Я думаю, что нужно GroupBy.ngroup:

#create values by size of columns
df['id'] = df.groupby(['a', 'b', 'c'])['a'] .transform('size')

#filter out rows
df = df[df['id'] > 1]
#sequencial id values
df['id'] = df.groupby(['a', 'b', 'c'])['a'].ngroup() + 1
    a     b     c    d  id
0  10  2017  20.0  231   1
1  10  2017  20.0  223   1
3  30  2017  11.0  134   2
4  30  2017  11.0  112   2
5  30  2017  11.0  111   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...