我想知道是否有一种优雅或更简单的方法可以在python中的同一对象上调用方法列表,而不是每次都重复编写。例如:
df['date_col'] = pd.to_datetime(df['date_col'])
df['date_col_day'] = df['date_col'].dt.day
df['date_col_month'] = df['date_col'].dt.month
df['date_col_year'] = df['date_col'].dt.year
可以用更优雅的方式代替
for method in [day, month, year]:
df[method.name] = df['date_col'].dt.method
我知道上面的示例在语法上是不正确的,这只是我想要的样子的证明。
有可能吗?
答案 0 :(得分:2)
如果您有许多称为“级联”的函数,即:
public static Delegate Combine(params Delegate?[]? delegates)
{
Delegate defaulDelegate = // someDelegate here
if (delegates == null || delegates.Length == 0)
return defaulDelegate;
Delegate d = delegates[0] ?? defaulDelegate;
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
y1 = fun1(df.x)
y2 = fun1(y1)
您可以使用 y3 = df.pipe(fun1).pipe(fun2).pipe(fun3)。
根据您的情况,情况有所不同,因为您要保存 每个部分结果都在相关列中。
因此,您应该应用一个生成 Series 的函数, 每个部分结果都在相关索引下。
示例:源DataFrame是:
y3 = fun1(y2)
( date_col 是 string 类型)。
定义以下转换函数:
date_col Xxx Yyy
0 2019-01-12 100 97.37
1 2019-01-16 100 86.15
2 2019-01-20 80 80.00
3 2019-01-23 100 100.00
并通过以下方式应用它:
def conv(str):
datTim = pd.to_datetime(str)
return pd.Series([datTim, datTim.day, datTim.month, datTim.year],
index=['date_col', 'date_col_day', 'date_col_month', 'date_col_year'])
请注意, pop 会检索给定的列,并将其从 df 中删除。 然后将 conv 应用于此列,生成一个DataFrame, 4列(日期及其“部分”)。最后一步是加入 源DataFrame的“其余部分”( dat_col 之后剩余的列 已删除)。
现在 date_col 是 datetime64 类型,其内容是:
dtc = df.pop('date_col')
df = dtc.apply(conv).join(df)