如何划分具有不同大小(熊猫)的两列?

时间:2020-09-25 22:56:39

标签: python pandas

我有两个光谱测量的数据帧(都有两列:IntensityWavelength),我需要在给定的波长中将一个强度除以另一个强度,如如果我要划分两个函数(I1 (λ) / I2 (λ))。困难在于两个数据帧都有不同的大小,并且其中一个的Wavelength值与另一个不完全相同(尽管显然它们``接近''了)。

1

一个有大约200条线(黑线),另一条有3648条(红线)。简而言之,红色图比黑色图更``填充'',但是正如我之前说的那样,各个数据帧的Wavelength值并不完全相同。

它们的波长范围也不同:

  • 黑色从300.2795.5 nm
  • 红色从199.975开始,一直到1027.43 nm

我喜欢做的事情是这样的:

2

请注意,我将黑色的强度除以红色的强度,然后将其对应的Wavelength的结果添加到新的df中。是否可以生成一个具有等效波长的新数据帧并在强度之间进行这种划分?

1 个答案:

答案 0 :(得分:0)

这是您问题的有效解决方案。我目前的假设是仪器的采样率是相同的。由于您没有提供任何样本,因此我生成了一些数据。答案是基于将Wavelength列上的两个数据帧串联起来。

import pandas as pd
import numpy as np

##generating the test data
black_lambda = np.arange(300.2,795.5,0.1)
red_lambda = np.arange(199.975,1027.43,0.1)

I_black = np.random.random((1,len(black_lambda))).ravel()
I_red = np.random.random((1,len(red_lambda))).ravel()

df = pd.DataFrame([black_lambda,I_black]).T
df1 = pd.DataFrame([red_lambda,I_red]).T
df.columns=['lambda','I_black']
df1.columns=['lambda','I_red']

从此处关注

#setting lambda as index for both dataframes
df.set_index(['lambda'],inplace=True)
df1.set_index(['lambda'],inplace=True)

#concatenating/merging both dataframes into one
df3 = pd.concat([df,df1],axis=1)

#since both dataframes are not of same length, there will be some missing values. Taking care of them by filling previous values (optional). 
df3.fillna(method='bfill',inplace=True)
df3.fillna(method='ffill',inplace=True)

#creating a new column 'division' to finish up the task
df3['division'] = df3['I_black'] / df3['I_red']

print(df3)

输出

           I_black     I_red  division
lambda                                
199.975   0.855777  0.683906  1.251308
200.075   0.855777  0.305783  2.798643
200.175   0.855777  0.497258  1.720993
200.275   0.855777  0.945699  0.904915
200.375   0.855777  0.910735  0.939655
...            ...       ...       ...
1026.975  0.570973  0.637064  0.896258
1027.075  0.570973  0.457862  1.247042
1027.175  0.570973  0.429709  1.328743
1027.275  0.570973  0.564804  1.010924
1027.375  0.570973  0.246437  2.316917