我用以下代码创建了以下df
:
df = pd.read_table('https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/06_Stats/Wind_Stats/wind.data', sep = "\s+", parse_dates = [[0,1,2]])
如果我们运行以下命令:
type(df['Yr_Mo_Dy'][0])
我们将看到['Yr_Mo_Dy']
下的观测值为pandas._libs.tslibs.timestamps.Timestamp
格式。
我想要做的是:每当我看到年份> = 2061(['Yr_Mo_Dy']
)时,我想减去-100,否则我只保留年份并继续迭代。
我尝试了以下代码:
for i in list(range(df.shape[0])):
# assign all the observations under df['Yr_Mo_Dy'] to ts
ts = df['Yr_Mo_Dy'][i]
if df['Yr_Mo_Dy'][i].year >=2061:
# replace the year in ts by year - 100
ts.replace(year=df['Yr_Mo_Dy'][i].year - 100)
else:
continue
但是循环什么也不做。我觉得这与变量赋值ts = df['Yr_Mo_Dy'][i]
有关。但我想不出另一种方法来完成这项工作。
考虑到我在this post中看到的答案,我试图在每次循环迭代后分配一个变量。
答案 0 :(得分:0)
您应该避免矢量化操作的手动循环。
在这种情况下,您可以使用numpy.where
创建条件序列:
df = pd.DataFrame({'A': pd.to_datetime(['2018-01-01', '2080-11-30',
'1955-04-05', '2075-10-09'])})
df['B'] = np.where(df['A'].dt.year >= 2061,
df['A'] - pd.DateOffset(years=100), df['A'])
print(df)
A B
0 2018-01-01 2018-01-01
1 2080-11-30 1980-11-30
2 1955-04-05 1955-04-05
3 2075-10-09 1975-10-09