python - Python Pandas:创建作为条件运行变量的列
问题描述
我正在尝试创建一个新的数据框列,该列充当运行变量,在某些条件下重置为零或“通过”。下面是我想要完成的一个简化示例。假设我正在尝试戒掉咖啡,并且我正在跟踪我连续几天不喝咖啡。在我忘记记录是否喝咖啡的日子里,我输入了“忘记”,我的计数不会受到影响。
以下是我目前完成此任务的方式,尽管我怀疑有一种更有效的方式来解决它。
提前致谢!
import pandas as pd
Day = [1,2,3,4,5,6,7,8,9,10,11]
DrankCoffee = ['no','no','forgot','yes','no','no','no','no','no','yes','no']
df = pd.DataFrame(list(zip(Day,DrankCoffee)), columns=['Day','DrankCoffee'])
df['Streak'] = 0
s = 0
for (index,row) in df.iterrows():
if row['DrankCoffee'] == 'no':
s += 1
if row['DrankCoffee'] == 'yes':
s = 0
else:
pass
df.loc[index,'Streak'] = s
解决方案
您可以使用groupby.transform
对于 each streak
,您正在寻找的是这样的:
def my_func(group):
return (group == 'no').cumsum()
您可以通过简单的比较来划分不同的条纹,并且cumsum
streak = (df['DrankCoffee'] == 'yes').cumsum()
0 0 1 0 2 0 3 1 4 1 5 1 6 1 7 1 8 1 9 2 10 2
然后应用变换
df['Streak'] = df.groupby(streak)['DrankCoffee'].transform(my_func)
推荐阅读
- swift - GeoFire 4 观察键输入的快照大小和计费
- excel - 使用 =F 为单元格分配一个空白值而不是零
- sql - SQL - 根据计数更新特定行
- c - 在 OpenMP 中生成与顺序代码相同的随机矩阵
- python - 跳过第一行的问题
- html - 可访问性:如何正确地为一个 INPUT 项目使用多个 LABEL 元素(通过 ARIA 等)?
- apache - MAMP(不是 MAMP pro)中的虚拟主机链接到错误的文件目录
- android - 在新的背景选项卡中强制打开链接(Android firefox)
- python - RuntimeWarning:已经创建了一个名为“Individual”的类,它将被覆盖
- c# - 单击按钮以在文本框中发送信息不起作用