1
votes

Regrouper par condition dans la base de données pandas

Je veux couper les données continues en un certain groupe. J'ai des données comme celle-ci:

Index Age Predict

group 1:
5     17    0
0     23    0

group 2:
6     29    1

group 3:
1     39    0

group 4:
3     41    1

group 5:
2     70    0
4     50    0

J'essaye:

Index Age Predict
5     17    0
0     23    0
6     29    1
1     39    0
3     41    1
2     70    0
4     50    0

Après le tri:

df_1 = df[['Age','Predict']]
data = df_1.sort_values(by='Age')


1 commentaires

vous avez besoin de pd.cut puis utilisez une compréhension de dict, si vous spécifiez vos tranches d'âge, ce serait utile


3 Réponses :


1
votes

IIUC, les groupes souhaités sont créés à partir de Predict, où diff entre les lignes suivantes n'est pas égal à 0. vous pouvez donc créer une colonne:

data_ = df.sort_values('Age')
d = {i: dfg 
     for i,(_, dfg) in enumerate(data_.groupby(data_['Predict'].diff().ne(0).cumsum()),1)}
print (d[1])
   Index  Age  Predict
5      5   17        0
0      0   23        0

Ou si vous souhaitez diviser vos données et ne pas créer la colonne de groupe, une façon est de créer un dictionnaire contenant chaque groupe

data_ = df.sort_values('Age')
data_['gr'] = data_['Predict'].diff().ne(0).cumsum()
print (data_)
   Index  Age  Predict  gr
5      5   17        0   1
0      0   23        0   1
6      6   29        1   2
1      1   39        0   3
3      3   41        1   4
4      4   50        0   5
2      2   70        0   5


0 commentaires

1
votes
df.groupby((df['Predict'] != df['Predict'].shift(1)).cumsum())
Basically check if the current value is not the same previous value, if not increment. This will allow you to group by the change in values of Predict

0 commentaires

1
votes

Utilisation de .grouby et .cumsum()

group 1
   Age  Predict
5   17        0
0   23        0
group 2
   Age  Predict
6   29        1
group 3
   Age  Predict
1   39        0
group 4
   Age  Predict
3   41        1
group 5
   Age  Predict
4   50        0
2   70        0

Résultat:

for i, grp in data.groupby([(data['Predict'] != data['Predict'].shift()).cumsum()]):
    print('group', i)
    print(grp)


0 commentaires