【问题标题】:How to divide two columns with different sizes (Pandas)?如何划分不同大小的两列(熊猫)?
【发布时间】:2021-01-12 06:27:37
【问题描述】:

我有两个光谱测量数据帧(都有两列:IntensityWavelength),我需要将一个的强度除以给定波长中另一个的强度,就好像我在除两个功能(I1 (λ) / I2 (λ))。困难在于两个数据框的大小不同,并且其中一个的Wavelength 值与另一个不完全相同(尽管显然它们“接近”)。

一个有大约 200 行(黑线),另一个有 3648 行(红线)。简而言之,红色图比黑色图“填充”很多,但正如我之前所说,各个dataframes的Wavelength值并不完全相同。

它们也有不同的波长范围:

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

我喜欢做的是这样的:

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

【问题讨论】:

  • 我已经添加了一个答案。请让我知道这对你有没有用。另外,如果对您有用,请接受/投票。

标签: python pandas


【解决方案1】:

这是您问题的有效解决方案。我目前的假设是仪器的采样率是相同的。由于您没有提供任何样本,因此我生成了一些数据。答案是基于在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

【讨论】:

  • 很高兴我能帮上忙。填充值要小心一点。因为我们正在添加人工值。另一种方法是删除 nan 值。所以,你可以用df.dropna(inplace=True) 代替fillna。此外,您可以使用 df.fillna(0,inplace=True) 填充 0 来代替 NaN 值,这样也可以正常工作。
猜你喜欢
  • 2020-05-05
  • 2017-12-14
  • 2020-01-06
  • 2017-07-21
  • 1970-01-01
  • 2016-08-05
  • 2021-11-07
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多