Pandas 新列基于旧列,有条件地处理 None 值
Pandas new column based on old column with conditional to handle None value
我正在尝试根据 pandas 中的现有列创建一个新列。现有列包含年份和季度。 IE:“201901”或为空白。如果原始列具有有效条目,则新列应包含完整的时间戳,否则为空白。
即:
Input:
201901
201902
None
201901
Desired output:
datetime(2019,01,01)
datetime(2019,03,01)
None
datetime(2019,01,01)
我的尝试:
df['stamp'] = np.where(df['quarter'].astype(str).str.len() == 8,\
datetime( df['quarter'].astype(str).str[0:4].astype(int), \
df['quarter'].astype(str).str[4:6].astype(int)*3,1), \
None)
结果:
ValueError: invalid literal for int() with base 10: ''
在我看来,条件的 True 分支的代码正在评估所有行。注意:条件是正确的,它正确识别了有效条目。
你能不能做点像...
df['stamp'] = df['quarter'].replace('', np.nan, inplace=True)
然后再做其他计算?
pandas.to_datetime
会自动解析季度,但需要采用 2019Q3
格式,年份后跟 Q 和季度。
因为你有一列带有 None
的整数,所以很难知道基础值是否真的是整数,或者它们是否被强制转换为 float
,这可能会弄乱字符串切片无需先更换。
import pandas as pd
s = df.stamp.astype(str).replace('\.0', '', regex=True) # Remove .replace if truly integer
pd.to_datetime(s.str[0:4] + 'Q' + s.str[-1], errors='coerce')
#0 2019-01-01
#1 2019-04-01
#2 NaT
#3 2019-01-01
#Name: stamp, dtype: datetime64[ns]
对于缺失的行,您会得到一些垃圾 'nanQn'
或 'NoneQe'
,但是由于它将变成 NaT
无论如何可能没什么大不了的。
我正在尝试根据 pandas 中的现有列创建一个新列。现有列包含年份和季度。 IE:“201901”或为空白。如果原始列具有有效条目,则新列应包含完整的时间戳,否则为空白。
即:
Input:
201901
201902
None
201901Desired output:
datetime(2019,01,01)
datetime(2019,03,01)
None
datetime(2019,01,01)
我的尝试:
df['stamp'] = np.where(df['quarter'].astype(str).str.len() == 8,\
datetime( df['quarter'].astype(str).str[0:4].astype(int), \
df['quarter'].astype(str).str[4:6].astype(int)*3,1), \
None)
结果:
ValueError: invalid literal for int() with base 10: ''
在我看来,条件的 True 分支的代码正在评估所有行。注意:条件是正确的,它正确识别了有效条目。
你能不能做点像...
df['stamp'] = df['quarter'].replace('', np.nan, inplace=True)
然后再做其他计算?
pandas.to_datetime
会自动解析季度,但需要采用 2019Q3
格式,年份后跟 Q 和季度。
因为你有一列带有 None
的整数,所以很难知道基础值是否真的是整数,或者它们是否被强制转换为 float
,这可能会弄乱字符串切片无需先更换。
import pandas as pd
s = df.stamp.astype(str).replace('\.0', '', regex=True) # Remove .replace if truly integer
pd.to_datetime(s.str[0:4] + 'Q' + s.str[-1], errors='coerce')
#0 2019-01-01
#1 2019-04-01
#2 NaT
#3 2019-01-01
#Name: stamp, dtype: datetime64[ns]
对于缺失的行,您会得到一些垃圾 'nanQn'
或 'NoneQe'
,但是由于它将变成 NaT
无论如何可能没什么大不了的。