gpt4 book ai didi

python - 在 Pandas 中创建许多新列的最 Pythonic 方式

转载 作者:太空狗 更新时间:2023-10-30 01:13:26 24 4
gpt4 key购买 nike

我有一个大型数据框 df(约 100 列和约 700 万行),我需要创建约 50 个新变量/列,它们是当前变量的简单转换。一种方法是使用许多 .apply 语句(我只是使用 transform* 作为简单转换的占位符,例如 max 或平方):

df['new_var1'] = df['old_var1'].apply(lambda x : transform1(x))
...
df['new_var50'] = df['old_var50'].apply(lambda x : transform50(x))

另一种方法是先创建一个字典

transform_dict = {
'new_var1' : lambda row : transform1(row),
...,
'new_var50' : lambda row : transform50(row)
}

然后写一个.apply.concat结合:

df = pd.concat([df, 
df.apply(lambda r: pd.Series({var : transform_dict[var](r) for var in transform_dict.keys()}), axis=1)], axis=1)

一种方法是否优于另一种方法,无论是在“Pythonic”方面,还是在效率、可扩展性、灵 active 方面?

最佳答案

开始于:

df = pd.DataFrame(np.random.random((1000, 100)))

添加单独的列:

def cols_via_apply(df):
for i in range(100, 150):
df[i] = df[i-100].apply(lambda x: x * i)
return df

%timeit cols_via_apply(df)

10 loops, best of 3: 29.6 ms per loop

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000 entries, 0 to 999
Columns: 150 entries, 0 to 149
dtypes: float64(150)
memory usage: 1.2 MB
None

似乎比使用 pd.concat 更有效 - 大概是因为在涉及的 DataFramerows 上有一个循环。所以这种差异会随着 DataFrame 变长而变得更糟:

def cols_via_concat(df):
df = pd.concat([df, df.apply(lambda row: pd.Series({i : i * row[i-100] for i in range(100, 150)}), axis=1)])
return df


%timeit cols_via_concat(df)

1 loops, best of 3: 450 ms per loop

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000 entries, 0 to 999
Columns: 150 entries, 0 to 149
dtypes: float64(150)
memory usage: 1.2 MB
None

关于python - 在 Pandas 中创建许多新列的最 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35180846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com