以下代码将函数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
返回一个列表。是否有更好或更简单的方法来添加这些列而无需在之前指定列数?
答案 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时,最终会将键用作索引,因此您无需提供显式列表作为索引,因此无需知道列中的列数提前。