如何无需拼接DataFrame,从Numpy数组初始化带补充列的Pandas DataFrame?
更优的DataFrame构造方案(无需拼接多个DataFrame)
当然有更简洁高效的方式!你完全可以一步到位构造出目标DataFrame,不用额外创建中间DataFrame再做拼接操作,既精简了代码,也减少了内存中临时对象的生成。
方法1:字典解包一次性构造
利用Python的字典解包语法(**),把基础列和重塑后的V列字典合并,直接传给pd.DataFrame:
import pandas as pd import numpy as np A = ['red', 'blue'] B = range(2) C = np.random.random((4,2,2)) df = pd.DataFrame({ 'Color': np.repeat(A, 2), 'Trial': np.tile(B, 2), **pd.DataFrame(C.reshape(4, 4)).add_prefix('V').to_dict('series') })
方法2:分步合并字典(可读性更强)
如果觉得一次性解包有点紧凑,也可以先分别定义基础列和V列的字典,再合并构造:
import pandas as pd import numpy as np A = ['red', 'blue'] B = range(2) C = np.random.random((4,2,2)) # 先准备基础列字典 base_columns = {'Color': np.repeat(A, 2), 'Trial': np.tile(B, 2)} # 生成V列的字典(键为V0/V1...,值为对应Series) v_columns = pd.DataFrame(C.reshape(4, 4)).add_prefix('V').to_dict('series') # 合并两个字典,构造完整DataFrame df = pd.DataFrame({**base_columns, **v_columns})
方法3:链式assign操作
如果你喜欢流畅的链式代码风格,也可以用assign方法直接给初始DataFrame添加V列:
import pandas as pd import numpy as np A = ['red', 'blue'] B = range(2) C = np.random.random((4,2,2)) df = pd.DataFrame({'Color': np.repeat(A,2), 'Trial': np.tile(B,2)}) \ .assign(**pd.DataFrame(C.reshape(4,4)).add_prefix('V').to_dict('series'))
为什么这些方法更好?
这些方案都避免了pd.concat的额外步骤,直接在构造阶段完成所有列的整合:
- 代码更简洁,逻辑更连贯
- 减少了中间DataFrame对象的创建,在处理大规模数组时,内存占用和运行效率都会更优
- 保持了和原方案完全一致的输出结果
内容的提问来源于stack exchange,提问作者Alxander
相关产品推荐
相关产品推荐

