Элегантный способ присвоения имен заголовков фрейму данных pandas при назначении новых столбцов в цикле for?

#python #pandas

#python #pandas

Вопрос:

У меня есть цикл for, который итеративно добавляет столбцы в фрейм данных pandas. Я также хочу назвать эти новые столбцы на основе списка. Теперь у меня есть запутанный способ, есть ли более элегантный способ сделать это?

При назначении нового столбца необходимо указать имя столбца. Однако по какой-то причине это не может быть переменной. Поэтому я использую фиктивный файл и после изменения имени столбца на основе списка, который я определил ранее. Хотя это не кажется слишком элегантным.

Столбцы фрейма данных должны быть [длина волны, слои [0] _n, слои [0] _k, … слои [z] _n, слои [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
  

Комментарии:

1. Вам не нужно назначать using assign , и если вы назначаете «простым» способом, нет проблем с использованием переменной: например, попробуйте x=’a’ , за которым следует n[x]= data.iloc[:,1].значения

2. если вы хотите создать новый столбец, сохраните значения в списке и после завершения for цикла присвоите его столбцу. Но вам действительно нужно использовать for цикл? Изучите pandas методы, которые вы найдете лучшей альтернативой

Ответ №1:

Поскольку у меня нет доступа к вашим CSV и т. Д., Я создаю некоторые поддельные данные для имитации этого процесса…

Давайте начнем с нескольких фреймов данных:

 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() позволяет использовать имя переменной для создания заголовка столбца при создании каждого столбца.

Комментарии:

1. Это действительно намного элегантнее, спасибо! Я не понимал, что вы можете ввести что-то в индекс фрейма данных, который еще не существует. Очень удобно!