Группировать по условию в pandas кадре данных - PullRequest
1 голос
/ 18 июня 2020

Я хочу разрезать данные продолжения на некоторую группу. У меня есть такие данные:

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

Я пробую:

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

После сортировки:

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

Что я могу сделать с данными классификатора в группе :

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

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 18 июня 2020
df.groupby((df['Predict'] != df['Predict'].shift(1)).cumsum())

В основном проверьте, не совпадает ли текущее значение с предыдущим значением, если не увеличивает его. Это позволит вам группировать по изменению значений Predict

1 голос
/ 18 июня 2020

Использование .grouby и .cumsum()

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

Результат:

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
1 голос
/ 18 июня 2020

IIU C, нужные вам группы создаются из Predict, где diff между следующими строками не равно 0. Таким образом, вы можете создать столбец:

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

Или, если хотите чтобы разделить данные, а не создавать столбец группы, можно создать словарь, содержащий каждую группу

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...