有没有一种优雅的方法可以在Python中的同一对象上调用方法列表?

时间:2019-12-29 10:58:35

标签: python python-3.x pandas

我想知道是否有一种优雅或更简单的方法可以在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

我知道上面的示例在语法上是不正确的,这只是我想要的样子的证明。

有可能吗?

1 个答案:

答案 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)