动态 - 自动乘法 - 熊猫数据帧

时间:2018-02-08 15:30:18

标签: python pandas dataframe multiplication

在Stackoverflow和网络上花了一段时间搜索和阅读后,我绝望了......

我有一个带有一些导入数据(光谱)的Pandas DataFrame。第一列是波长,而其他列是各种光谱(数据)。列的名称是从列表中导入的,该列表从路径中读取文件名并仅保留名称。

我想要实现的目标,我似乎无法理解如何将每个列与波长列相乘并覆盖现有列或创建新数据帧(无关紧要)。

这是我到目前为止完成工作的代码(即使不是最优雅的代码,也可以完成工作):

path = r'"thePathToData\PL_calc\Data_NIR' 
idx = 0

#Create the DataFrame with all the data from the path above, use the filenames as column names
all_files = glob.glob(os.path.join(path, "*.asc"))
df = pd.concat((pd.read_csv(f, usecols=[1],  sep='\t') for f in all_files), axis=1) #usecol=1 for the spectrum only

fileNames = [] # create a list for the filenames
for i in range(0,len(all_files)):
    fileNames.append(all_files[i][71:-4])

df.columns = fileNames # assign the filenames as columns
wavelengths = pd.read_csv(all_files[0], usecols=[0],  sep='\t') # add the wavelength column as first column of the dataframe
df.insert(loc=idx, column='Wavelength', value=wavelengths)

如果我只绘制DF的头部,它看起来像这样:

Wavelength  F8BT_Pure_Batch1_px1_spectra_4V  \ ...
0    478.0708                        -3.384101   
1    478.3917                        -1.580399   
2    478.7126                        -0.323580   
3    479.0334                        -1.131425   
4    479.3542                         1.202728 

完整的DF是:

1599 rows × 46 columns

问题1:

我无法找到一种自动(动态)方式将每个col与第一个相乘,基本上就是这样:

for i in range(1, len(df.columns)):
    df[[i]] = df[[0]] * df[[i]]

问题2:

为什么这样做:

df['F8BT_Pure_Batch1_px1_spectra_4V'] = df['Wavelength']*df['F8BT_Pure_Batch1_px1_spectra_4V']

虽然没有,但却给了"IndexError: indices are out-of-bounds"

df[[1]] = df[[0]]*df[[1]]

但是当我print(df[['Wavelength']]) Name: Wavelength, dtype: float64print(df[[0]]) [1599 rows x 1 columns]时,我会得到相同的数字..

问题3:

为什么df[fileNames] = df[fileNames].multiply(df.Wavelength)给我一个ValueError: Columns must be same length as key?所有列都具有相同的长度(1599行长,0-1598,在这种情况下总共46列)。 fileNames包含导入文件的名称和数据框列的名称。

非常感谢提前为您提供帮助......

亚历

1 个答案:

答案 0 :(得分:0)

问题1

要将您的波长列乘以DataFrame中的每个其他列,您可以使用:

df.iloc[:, 1:] = df.iloc[:, 1:].mul(df['Wavelength'], axis=0)

这假设您的波长列是第一列。

问题2

使用整数选择相似的列,要求将DataFrame的列命名为0,1等,作为整数。您的DataFrame中没有。要按索引编号选择列,请查看pandas' iloc method.

的文档

问题3

当您致电df[fileNames]时,您将获得一个与列表fileNames的长度相同的列数的DataFrame。您的代码df[fileNames].multiply(df.Wavelength)未向您提供与df[fileNames]具有相同列数的DataFrame,因此您无法分配这些值。使用乘法函数中的axis=0参数对我有用。