Python 熊猫:重新索引后访问时间戳属性
在使用pd.date\u range重新索引数据帧后,我很难理解时间戳会发生什么。如果我有以下示例,其中我使用pd.DataFrame.reindex创建更长的时间序列:Python 熊猫:重新索引后访问时间戳属性,python,pandas,time-series,Python,Pandas,Time Series,在使用pd.date\u range重新索引数据帧后,我很难理解时间戳会发生什么。如果我有以下示例,其中我使用pd.DataFrame.reindex创建更长的时间序列: import pandas as pd import numpy as np idx_inital = pd.date_range('2004-03-01','2004-05-05') df = pd.DataFrame(index = idx_inital, data={'data': np.random.randint
import pandas as pd
import numpy as np
idx_inital = pd.date_range('2004-03-01','2004-05-05')
df = pd.DataFrame(index = idx_inital, data={'data': np.random.randint(0,100,idx_inital.size)})
idx_new = pd.date_range('2004-01-01','2004-05-05')
df= df.reindex(idx_new, fill_value = 0)
返回所有数据都分配为0的预期结果:
现在,如果要使用“应用”指定新列,请使用:
def year_attrib(row):
if row.index.month >2:
result = row.index.year + 11
else:
result = row.index.year + 15
return result
df['year_attrib'] = df.apply(lambda x: year_attrib(x), axis=1)
我得到一个错误:
AttributeError: ("'Index' object has no attribute 'month'", 'occurred at index 2004-01-01 00:00:00')
如果我检查每一行传递给year_attrib的内容:
看起来时间戳正在传递给Name,我不知道如何访问它。当我查看row.index时,我得到:
这种行为的原因是什么?问题是,当对参数axis=1的数据帧使用apply函数时,数据帧的每一行都作为一个序列传递给函数。看
因此,在year_attrib函数中实际发生的是,row.index将返回该行的索引,即数据帧的列
In [5]: df.columns
Out[5]: Index(['data'], dtype='object')
因此,使用row.index.month时将引发AttributeError
如果确实要使用此函数获取所需内容,请改用row.name.month
但是仍然建议使用矢量化方式,如:
In [10]: df.loc[df.index.month>2, 'year_attrib'] = df[df.index.month>2].index.year + 11
In [11]: df.loc[df.index.month<=2, 'year_attrib'] = df[df.index.month>2].index.year + 15
In [12]: df
Out[12]:
data year_attrib
2004-03-01 93 2015
2004-03-02 48 2015
2004-03-03 88 2015
2004-03-04 44 2015
2004-03-05 11 2015
2004-03-06 4 2015
2004-03-07 70 2015
df['year\u attrib']=np.wheredf.index.month>2,22,11您不需要函数this@anky_91啊,我说得太简单了。我已经修改为func,返回一个基于row.index.year相同np的值,其中df.index.month>2,df.index.year+11,df.index.year+15感谢您的解释。我知道每一行都是作为一个系列传递的,这就是为什么我开始研究系列df.iloc[0]。我试着寻找row.Name,而不是您指出的row.Name。当您查看printrow时,它有点误导,其中n在名称中大写。我现在对apply的工作原理有了更好的了解。干杯是的,你做得对。我误解了问题的最后一部分:-。顺便说一句,您可以使用dirrow查看如何访问名称meyhod。刚刚尝试运行我得到的df.loc行:ValueError:shape mismatch:shape 126的值数组,无法广播到shape 66的索引结果,。从您的示例的外观来看,您在重新索引df之前显示了它。呃,是的,我忘了。请参阅修改后的答案。
row.index
Out[34]: Index(['data'], dtype='object')
In [5]: df.columns
Out[5]: Index(['data'], dtype='object')
In [10]: df.loc[df.index.month>2, 'year_attrib'] = df[df.index.month>2].index.year + 11
In [11]: df.loc[df.index.month<=2, 'year_attrib'] = df[df.index.month>2].index.year + 15
In [12]: df
Out[12]:
data year_attrib
2004-03-01 93 2015
2004-03-02 48 2015
2004-03-03 88 2015
2004-03-04 44 2015
2004-03-05 11 2015
2004-03-06 4 2015
2004-03-07 70 2015