我想在数据框中为选择性列的特定日期范围创建零。我坚持寻找任何有效的解决方案。
我的代码创建一个1s的矩阵。可以说date = 1/10/2016-16/8/2018(ytdd)。 matrix1cols=A,B,C,D:
df = pd.DataFrame(np.ones(shape=(len(dates), len(matrix1cols))), index=dates)
df.columns = ['A','B','C', 'D']
现在,我希望在以下所有年份中将A列的Q1(一月至三月)日期设为0,B的Q2日期设为0,C的Q3日期设为0,col D的Q4日期设为0。 df。 (我实际上是为自己创建标志)
Ps-我的约会已经很多年了,为了方便起见,我简化了数据集。
答案 0 :(得分:2)
一种解决方案是使用简单的for
循环。作为初步步骤,请小心将索引转换为datetime
,例如通过df.index = pd.to_datetime(df.index)
。
for q, col in enumerate(df, 1):
df.loc[df.index.quarter == q, col] = 0
在这种情况下,等效地,但更详细:
for q, col in zip(range(1, 5), df):
df.loc[df.index.quarter == q, col] = 0
答案 1 :(得分:2)
dates = pd.date_range('2016/10/01', '2018/08/16', freq='M')
matrixcols = list('ABCD')
df = pd.DataFrame(np.ones((len(dates), len(matrixcols)), int), dates, matrixcols)
A B C D
2016-10-31 1 1 1 1
2016-11-30 1 1 1 1
2016-12-31 1 1 1 1
2017-01-31 1 1 1 1
2017-02-28 1 1 1 1
2017-03-31 1 1 1 1
2017-04-30 1 1 1 1
2017-05-31 1 1 1 1
2017-06-30 1 1 1 1
2017-07-31 1 1 1 1
2017-08-31 1 1 1 1
2017-09-30 1 1 1 1
2017-10-31 1 1 1 1
2017-11-30 1 1 1 1
2017-12-31 1 1 1 1
2018-01-31 1 1 1 1
2018-02-28 1 1 1 1
2018-03-31 1 1 1 1
2018-04-30 1 1 1 1
2018-05-31 1 1 1 1
2018-06-30 1 1 1 1
2018-07-31 1 1 1 1
创建一个自定义数组,定义放置零的位置
i = np.array([
#A B C D
[1, 1, 0, 1], # Q1 -> Only column C is zero
[1, 0, 0, 0], # Q2 -> cols B, C, D are zero
[0, 0, 1, 1], # Q3 -> cols A, B are zero
[0, 1, 1, 0], # Q4 -> cols A, D are zero
])
q = df.index.quarter - 1
df * i[q]
A B C D
2016-10-31 0 1 1 0
2016-11-30 0 1 1 0
2016-12-31 0 1 1 0
2017-01-31 1 1 0 1
2017-02-28 1 1 0 1
2017-03-31 1 1 0 1
2017-04-30 1 0 0 0
2017-05-31 1 0 0 0
2017-06-30 1 0 0 0
2017-07-31 0 0 1 1
2017-08-31 0 0 1 1
2017-09-30 0 0 1 1
2017-10-31 0 1 1 0
2017-11-30 0 1 1 0
2017-12-31 0 1 1 0
2018-01-31 1 1 0 1
2018-02-28 1 1 0 1
2018-03-31 1 1 0 1
2018-04-30 1 0 0 0
2018-05-31 1 0 0 0
2018-06-30 1 0 0 0
2018-07-31 0 0 1 1
另一种观点认为它适用于正确的季度。
i = np.array([
#A B C D
[1, 1, 0, 1], # Q1 -> Only column C is zero
[1, 0, 0, 0], # Q2 -> cols B, C, D are zero
[0, 0, 1, 1], # Q3 -> cols A, B are zero
[0, 1, 1, 0], # Q4 -> cols A, D are zero
])
q = df.index.quarter - 1
df.set_index(df.index.to_period('Q'), append=True).swaplevel(0, 1) * i[q]
A B C D
2016Q4 2016-10-31 0 1 1 0
2016-11-30 0 1 1 0
2016-12-31 0 1 1 0
2017Q1 2017-01-31 1 1 0 1
2017-02-28 1 1 0 1
2017-03-31 1 1 0 1
2017Q2 2017-04-30 1 0 0 0
2017-05-31 1 0 0 0
2017-06-30 1 0 0 0
2017Q3 2017-07-31 0 0 1 1
2017-08-31 0 0 1 1
2017-09-30 0 0 1 1
2017Q4 2017-10-31 0 1 1 0
2017-11-30 0 1 1 0
2017-12-31 0 1 1 0
2018Q1 2018-01-31 1 1 0 1
2018-02-28 1 1 0 1
2018-03-31 1 1 0 1
2018Q2 2018-04-30 1 0 0 0
2018-05-31 1 0 0 0
2018-06-30 1 0 0 0
2018Q3 2018-07-31 0 0 1 1