我需要将一列的特定范围的值与另一列中的特定字符串进行比较,以将日期列更新为1,7,30天
Col A ColB colc
5 Internal 1-1-2022
7 external 1-1-2022
4 external 1-1-2022
3 external 1-1-2022
因此,如果df[ColA]<8
和df[ColB]=External
使df[colc]增加7天。如果df[ColA]>=8
和df[ColB]=External
使df[colc]增加30天,如果df[ColB]=Internal
使df[colc]增加120天
您可以使用numpy.select
来处理所有条件:
我将它们简化为:
- 如果ColB是"内部的";→添加120天
- else,如果ColA≤8 ->add 7 days
- 其他→添加30天
factor = np.select([df['ColB'].eq('Internal'), df['Col A'].le(8)], [120, 7], 30)
df['new'] = (pd.to_datetime(df['colc'], dayfirst=True)
.add(pd.DateOffset(days=1)*a)
.dt.strftime('%-d-%-m-%-Y')
)
输出:
Col A ColB colc new
0 5 Internal 1-1-2022 3-1-2022
1 7 external 1-1-2022 6-1-2022
2 4 external 1-1-2022 1-1-2022
3 3 external 1-1-2022 3-1-2022
使用与@mozway相同的np.select
,我建议使用pd.Timedelta
。
df = pd.DataFrame(
{
'Col A': [5, 7, 4, 3],
'ColB': ['Internal', 'external', 'external', 'external'],
'colc': pd.to_datetime("1/1/2022", format="%m/%d/%Y")
}
)
df['colc'] = [
(a + pd.Timedelta(b, 'd')) for (a, b) in
zip(df.colc, np.select([df['ColB'].eq('Internal'), df['Col A'].le(8)], [120, 7], 30))
]
print(df)
结果:
Col A ColB colc
0 5 Internal 2022-05-01
1 7 external 2022-01-08
2 4 external 2022-01-08
3 3 external 2022-01-08