通过在panda中的组中更改列值来创建组

  • 本文关键字:创建组 panda python-3.x pandas
  • 更新时间 :
  • 英文 :


当Success或Failure列返回True值时,我想在每个Chat_id中创建组。如果成功或失败列的前一行中存在True值,则组的值将更改。在熊猫身上我该怎么做。因此,基本上,我想创建Group列,但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 grouping(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))

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

它更像

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

最新更新