首页 > 解决方案 > Python 3 根据其他列的变量创建列

问题描述

我有一个包含年、月和星期几的数据集。但是,它缺少该月的实际日期(即从第 1 天到第 30 天)。数据集如下:

#   Year    Month   Day_Of_Week
22024   2002    January Tuesday
22101   2002    January Wednesday
22146   2002    January Thursday
22201   2002    January Friday
22247   2002    January Saturday
22280   2002    January Sunday
22335   2002    January Monday
22383   2002    January Tuesday
22384   2002    January Wednesday
22424   2002    January Thursday
22459   2002    January Friday
22511   2002    January Saturday
22598   2002    January Sunday
22599   2002    January Monday
22686   2002    January Tuesday
22687   2002    January Wednesday
22688   2002    January Wednesday
22689   2002    January Wednesday
22761   2002    January Wednesday
22762   2002    January Wednesday
22763   2002    January Wednesday
22764   2002    January Wednesday
22765   2002    January Thursday
22766   2002    January Thursday
22767   2002    January Thursday
22768   2002    January Thursday
22814   2002    January Friday
22815   2002    January Friday
22816   2002    January Friday
22817   2002    January Friday
22818   2002    January Friday

查找日期的逻辑非常简单。表中的第一条记录用于第 1 天。第二条记录用于第 2 天,每当“Day_Of_Week”从前一条记录更改时,我们就会增加天数。当月份是“一月”时,我们计算 31 天,“二月”我们计算 28 天,依此类推。

使用熊猫,我想创建一个名为“Crash_Day”的新列。如何按照上面的逻辑遍历记录并在新列中填充我的记录?

如何构造一个 for 循环来读取每一列的记录并相应地填充新列?

到目前为止,这是我的代码

import pandas as pd

crash_data = pd.read_csv('data.csv')
print('Length: {} rows.'.format(len(crash_data)))
print(crash_data.head())

如果有人有兴趣查看数据,请访问以下链接: 数据

标签: python-3.xpandasnumpydataframecalculated-columns

解决方案


如果所有日期都是连续的,并且它们之间没有缺失,则可以使用 lambda 函数,通过( ) 比较shifted 值作为每个连续值的开始,然后使用for :ne!=cumsumcounter

df['day'] = (df.groupby(['Year','Month'])['Day_Of_Week']
               .transform(lambda x: x.ne(x.shift()).cumsum()))

替代解决方案:

s = df['Day_Of_Week'].ne(df['Day_Of_Week'].shift())
df['day'] = s.groupby([df['Year'],df['Month']]).cumsum().astype(int)

print (df)
       Year     Month Day_Of_Week  day
22024  2002   January     Tuesday    1
22101  2002   January   Wednesday    2
22146  2002   January    Thursday    3
22201  2002   January      Friday    4
22247  2002   January    Saturday    5
22280  2002   January      Sunday    6
22335  2002   January      Monday    7
22383  2002   January     Tuesday    8
22384  2002   January   Wednesday    9
22424  2002   January    Thursday   10
22459  2002   January      Friday   11
22511  2002   January    Saturday   12
22598  2002   January      Sunday   13
22599  2002   January      Monday   14
22686  2002   January     Tuesday   15
22687  2002   January   Wednesday   16
22688  2002   January   Wednesday   16
22689  2002   January   Wednesday   16
22761  2002   January   Wednesday   16
22762  2002   January   Wednesday   16
22763  2002   January   Wednesday   16
22764  2002   January   Wednesday   16
22765  2002   January    Thursday   17
22766  2002   January    Thursday   17
22767  2002   January    Thursday   17
22768  2002   January    Thursday   17
22814  2002   January      Friday   18
22815  2002   January      Friday   18
22816  2002   January      Friday   18
22817  2002   January      Friday   18
22818  2002   January      Friday   18
22817  2002  February   Wednesday    1
22818  2002  February   Wednesday    1

推荐阅读