看来你只是想要什么
df['date'] = df['date'].map(Quarter)
请注意,您不能将列数据类型更改为自定义类型。包含自定义 python 对象的列(系列)将始终具有通用 object dtype。
class Quarter:
def __init__(self, date):
self.year = date.year
self.quarter = date.quarter
def __repr__(self):
return f'{self.year} Q{self.quarter}'
>>> df = pd.DataFrame({
'date': pd.date_range('01-01-2021', periods=10, freq='2M')
})
>>> df['date']
0 2021-01-31
1 2021-03-31
2 2021-05-31
3 2021-07-31
4 2021-09-30
5 2021-11-30
6 2022-01-31
7 2022-03-31
8 2022-05-31
9 2022-07-31
Name: date, dtype: datetime64[ns]
>>> df['date'] = df['date'].map(Quarter)
>>> df['date']
0 2021 Q1
1 2021 Q1
2 2021 Q2
3 2021 Q3
4 2021 Q3
5 2021 Q4
6 2022 Q1
7 2022 Q1
8 2022 Q2
9 2022 Q3
Name: date, dtype: object
# 'date' column data type
>>> df['date'].dtype
dtype('O')
# data type of each element of 'date' column
>>> df['date'].map(type)
0 <class '__main__.Quarter'>
1 <class '__main__.Quarter'>
2 <class '__main__.Quarter'>
3 <class '__main__.Quarter'>
4 <class '__main__.Quarter'>
5 <class '__main__.Quarter'>
6 <class '__main__.Quarter'>
7 <class '__main__.Quarter'>
8 <class '__main__.Quarter'>
9 <class '__main__.Quarter'>
Name: date, dtype: object
我正在寻找允许方法链接的东西。我可以做df.assign(date = lambda x: x['date'].map(Quarter)),但是多列会变得很混乱
使用DataFrame.agg:
>>> df.agg({'date': Quarter})
date
0 2021 Q1
1 2021 Q1
2 2021 Q2
3 2021 Q3
4 2021 Q3
5 2021 Q4
6 2022 Q1
7 2022 Q1
8 2022 Q2
9 2022 Q3
如果您想就地更改,您可以定义一个通用函数,该函数接收 DataFrame df 和格式为 {'column of df': func_to_apply_to_column} 的字典,类似于 astype,并将每个函数相应地应用于相应的列。要将其与方法链接一起使用,请使用DataFrame.pipe。
def map_columns(df, col_func_dict):
for col, func in col_func_dict.items():
df[col] = df[col].map(func)
return df
>>> df.pipe(map_columns, {'date': Quarter})
date
0 2021 Q1
1 2021 Q1
2 2021 Q2
3 2021 Q3
4 2021 Q3
5 2021 Q4
6 2022 Q1
7 2022 Q1
8 2022 Q2
9 2022 Q3