Создание групп путем изменения значений столбцов внутри группы в пандах - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы создать группы в каждом Chat_id, когда столбец Success или Failure возвращает значение True.Значение группы изменяется, если в предыдущей строке в столбце «Успех» или «Ошибка» указано значение «Истина».Как я должен идти об этом в пандах.Таким образом, в основном, столбец группы - это то, что я хотел бы создать, но столбец chat_id, Success и Failure уже присутствует.

+---------+-------+---------+---------+
| Chat_id | Group | Success | Failure |
+---------+-------+---------+---------+
| A       |     0 | FALSE   | FALSE   |
| A       |     0 | FALSE   | FALSE   |
| A       |     0 | TRUE    | FALSE   |
| A       |     1 | FALSE   | FALSE   |
| A       |     1 | FALSE   | TRUE    |
| A       |     2 | FALSE   | FALSE   |
| A       |     2 | FALSE   | FALSE   |
| B       |     0 | FALSE   | FALSE   |
| B       |     0 | FALSE   | FALSE   |
| B       |     0 | FALSE   | TRUE    |
| B       |     1 | FALSE   | FALSE   |
| B       |     1 | FALSE   | FALSE   |
| B       |     1 | FALSE   | FALSE   |
| C       |     0 | FALSE   | FALSE   |
| C       |     0 | TRUE    | FALSE   |
| C       |     1 | FALSE   | FALSE   |
| C       |     1 | TRUE    | FALSE   |
+---------+-------+---------+---------+

Пробовал также следующее, но, похоже, не работает.

def groupping(dfg):
    ind=0:
    for row in dfg:
        if row.Success==True or row.Failure==True:
            ind+=1
            return ind
df.groupby(chat_id).apply(lambda x: grouping(x))

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Это больше похоже на

df[['Success','Failure']].sum(1).gt(0).groupby(df.Chat_id).cumsum()
Out[273]: 
0     0.0
1     0.0
2     1.0
3     1.0
4     2.0
5     2.0
6     2.0
7     0.0
8     0.0
9     1.0
10    1.0
11    1.0
12    1.0
13    0.0
14    1.0
15    1.0
16    2.0
dtype: float64

Исправление вашего кода

def grouping(dfg):
    ind=0
    l=[]
    for _,row in dfg.iterrows():
        if row.Success==True or row.Failure==True:
            ind+=1
            l.append(ind)
        else :
            l.append(ind)
    return pd.Series(l)
df.groupby('Chat_id').apply(grouping)
Out[292]: 
Chat_id   
A        0    0
         1    0
         2    1
         3    1
         4    2
         5    2
         6    2
B        0    0
         1    0
         2    1
         3    1
         4    1
         5    1
C        0    0
         1    1
         2    1
         3    2
dtype: int64
0 голосов
/ 30 ноября 2018

cumsum

Создание нового столбца 'Flag'

df = df.assign(Flag=(df.Success | df.Failure).cumsum())

df

   Chat_id  Group  Success  Failure  Flag
0        A      0    False    False     0
1        A      0    False    False     0
2        A      0     True    False     1
3        A      1    False    False     1
4        A      1    False     True     2
5        A      2    False    False     2
6        A      2    False    False     2
7        B      0    False    False     2
8        B      0    False    False     2
9        B      0    False     True     3
10       B      1    False    False     3
11       B      1    False    False     3
12       B      1    False    False     3
13       C      0    False    False     3
14       C      0     True    False     4
15       C      1    False    False     4
16       C      1     True    False     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...