通过apply动态地将列添加到数据框

时间:2018-06-06 17:00:14

标签: python pandas

以下代码将函数f应用于数据框列data_df["c"],并将结果连接到原始数据框,即将1024列连接到数据框data_df

data_df = apply_and_concat(data_df, "c", lambda x: f(x, y), [y + "-dim" + str(i) for i in range(0,1024)])

def apply_and_concat(df, field, func, column_names):
    return pd.concat((
        df,
        df[field].apply(
            lambda cell: pd.Series(func(cell), index=column_names))), axis=1)

问题是我想动态执行它,这意味着我不知道它返回了多少列。 f返回一个列表。是否有更好或更简单的方法来添加这些列而无需在之前指定列数?

1 个答案:

答案 0 :(得分:0)

您对pd.concat(df, df.apply(...), axis=1)的使用已经很好地解决了主要任务。看起来您的主要问题实际上归结为“我如何命名未知数量的列”,您很乐意使用基于顺序整数的名称。为此,请使用itertools.count()

import itertools

f_modified = lambda x: dict(zip(
    ('{}-dim{}'.format(y, i) for i in itertools.count()),
    f(x, y)
))

然后使用f_modified代替f。这样,您将获得一个字典而不是一个列表,其中包含任意数量的动态生成的名称作为键。将此字典转换为Series时,最终会将键用作索引,因此您无需提供显式列表作为索引,因此无需知道列中的列数提前。