PANDAS groupby 2列(带条件)

xzabzqsa  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(165)

我有一个数据框,我需要按2列分组,并根据条件创建一个新列。我的数据如下所示:
| 识别号|星期|天数|
| - ------|- ------|- ------|
| 1个|1个|第二章|
| 1个|1个|三个|
| 1个|第二章|四个|
| 1个|第二章|1个|
| 第二章|1个|1个|
| 第二章|第二章|第二章|
| 三个|1个|四个|
我需要按ID & week列分组,这样每周的每个ID都有一行。groupby基于条件-如果某周的ID在day_num列中的值为1,则groupby下的值为1,否则为0。例如,ID 1在两行下都有2 & 3,因此在groupby下等于0,对于ID 1的第2周,它有一行值为1。因此为1。
我需要的输出如下所示:
| 识别号|星期|第1天|
| - ------|- ------|- ------|
| 1个|1个|无|
| 1个|第二章|1个|
| 第二章|1个|1个|
| 第二章|第二章|无|
| 三个|1个|无|
我搜索并找到了这段代码,但它使用了count,我只需要在这里写入值1或0。

df1=df1.groupby('ID','week')['day_num'].apply(lambda x: (x=='1').count())

有什么办法吗?
谢谢!

efzxgjgh

efzxgjgh1#

你也可以从另一个Angular 着手:检查“day_num”中的1是否相等,并按ID & week对 that 分组。然后用any进行聚合,查看分组中是否有1。最后将True/False转换为1/0,并将分组移到列中。

df["day_num"].eq(1).groupby([df["ID"], df["week"]]).any().astype(int).reset_index()

   ID  week  day_num
0   1     1        0
1   1     2        1
2   2     1        1
3   2     2        0
4   3     1        0
krcsximq

krcsximq2#

import pandas as pd

src = pd.DataFrame({'ID': [1, 1, 1, 1, 2, 2, 3],    
                    'week': [1, 1, 2, 2, 1, 2, 1],    
                    'day_num': [2, 3, 4, 1, 1, 2, 4],
                    })

src['day_num'] = (~(src['day_num']-1).astype(bool)).astype(int)
r = src.sort_values(by=['day_num']).drop_duplicates(['ID', 'week'], keep='last').sort_index().reset_index(drop=True)
print(r)

结果

ID  week  day_num
0   1     1        0
1   1     2        1
2   2     1        1
3   2     2        0
4   3     1        0

相关问题