У меня есть цикл for, который итеративно добавляет столбцы в фрейм данных pandas. Я также хочу назвать эти новые столбцы на основе списка. У меня сейчас запутанный способ, есть ли более элегантный способ сделать это?
При назначении нового столбца необходимо указать имя столбца. Однако это не может быть переменным по какой-то причине. Поэтому я использую манекен и после изменения имени столбца на основе списка, который я определил ранее. Хотя это не кажется слишком элегантным.
Столбцы фрейма данных должны быть [длина волны, слои[0]_n, слои[0]_k, ... слои[г]_n, слои[г]_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
если вы хотите создать новый столбец, сохраните значения в списке и после завершения цикла for назначьте его столбцу. Но вам действительно нужно использовать цикл for? Изучите pandas методы, вы найдете лучшую альтернативу






Поскольку у меня нет доступа к вашим файлам 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() позволяет использовать имя переменной для создания заголовка столбца при создании каждого столбца.
Это действительно намного элегантнее, спасибо! Я не понимал, что вы можете ввести что-то в индекс фрейма данных, которого еще не существует. Очень удобно!
Вам не нужно назначать с помощью
assign, и если вы назначаете «простым» способом, нет проблем с использованием переменной: например, попробуйте x='a', а затем n[x]= data.iloc[:, 1].значения