首页 > 解决方案 > 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

在此处输入图像描述

标签: pythonpython-3.xpandasdataframeconditional-statements

解决方案


您可以使用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)

推荐阅读