首页 > 解决方案 > 在 for 循环中分配新列时将标题名称分配给熊猫数据框的优雅方法?

问题描述

我有一个 for 循环,它迭代地将列添加到 pandas 数据帧。我还希望根据列表命名这些新列。我现在有一个复杂的方式,有没有更优雅的方式来做到这一点?

分配新列时,您必须指定列名。但是,由于某种原因,这不能是可变的。所以我使用一个虚拟对象,然后根据我之前定义的列表更改列名。不过,这似乎不太优雅。

数据框列应为 [wavelength, layers[0]_n, layers[0]_k, ... layers[ z ]_n, layers[ z ]_k]

layers = ['Ag', 'SiO2', 'Au']    
colnames = ['wavelength']
for l in layers:
    colnames.append(l+'_n')
    colnames.append(l+'_k')

n = pd.read_csv('matdata\\' + layers[0] + '.csv')
n = n.iloc[:,0] #get only wavelength
for l in layers:
    data = pd.read_csv('matdata\\' + l + '.csv') #read appropriate file
    n = n.assign(a = data.iloc[:,1].values)
    n = n.assign(b = data.iloc[:,2].values)
    n.columns = colnames

标签: pythonpandas

解决方案


因为我无权访问您的 CSV 等,所以我正在创建一些假数据来模拟这个过程......

让我们从几个 DataFrames 开始:

n = pd.DataFrame([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]], 
                  columns=['x', 'y', 'z'])

dfb = pd.DataFrame([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

layers = ['Ag', 'SiO2']

for layer in layers:
    n[layer] = dfb.iloc[:, 1].values

产量:

   x  y  z  Ag  SiO2
0  1  2  3   2     2
1  4  5  6   5     5
2  7  8  9   8     8

使用这种技术,而不是使用.assign()允许在创建每列时使用变量名称来创建列标题。


推荐阅读