将应用(多个输出)的结果添加到具有列名的现有 DataFrame 的更好方法

Bra*_*roy 5 python apply dataframe pandas

我正在熊猫数据框的行上应用一个函数。该函数返回四个值(即每行四个值)。实际上,这意味着从 apply 函数返回的对象是一个包含元组的系列。我想将这些添加到他们自己的列中。我知道我可以将该输出转换为 DataFrame,然后与旧的 DataFrame 连接,如下所示:

import pandas as pd


def some_func(i):
    return i+1, i+2, i+3, i+4

df = pd.DataFrame(range(10), columns=['start'])
res = df.apply(lambda row: some_func(row['start']), axis=1)

# convert to df and add column names
res_df = res.apply(pd.Series)
res_df.columns = ['label_1', 'label_2', 'label_3', 'label_4']

# concatenate with old df
df = pd.concat([df, res_df], axis=1)
print(df)
Run Code Online (Sandbox Code Playgroud)

我的问题是是否有更好的方法来做到这一点?特别是res.apply(pd.Series)似乎多余的,但我不知道更好的选择。性能对我来说是一个重要因素。


根据要求,示例输入 DataFrame 可能如下所示

   start
0      0
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
Run Code Online (Sandbox Code Playgroud)

以及预期的输出,添加了四个列:

   start  label_1  label_2  label_3  label_4
0      0        1        2        3        4
1      1        2        3        4        5
2      2        3        4        5        6
3      3        4        5        6        7
4      4        5        6        7        8
5      5        6        7        8        9
6      6        7        8        9       10
7      7        8        9       10       11
8      8        9       10       11       12
9      9       10       11       12       13
Run Code Online (Sandbox Code Playgroud)

Kev*_*ave 5

直接给 DataFrame 赋值会比连接更快。

这是分配方式之一

df = pd.DataFrame(range(10), columns=['start'])

df['label_1'], df['label_2'], df['label_3'], df['label_4'] = zip(*[some_func(x) for x in df['start']])
Run Code Online (Sandbox Code Playgroud)

这比res.apply(pd.Series).

有关分配多列的更多方法,请参阅同时向 pandas添加多列。

  • 这是最快的解决方案:) (3认同)