Pandas DataFrame函数调用异常:仅首列计算结果有效问题咨询
解决Pandas调用自定义函数仅第一行得到结果的问题
我一眼就看出问题所在了——你从df2里提取的G和H是Pandas Series对象,不是单个的标量值,这导致函数运算时发生了索引对齐问题,只有索引匹配的第一行能得到有效结果,其他行因为索引不匹配变成了NaN。
问题根源
当你执行G=df2['a']和H=df2['b']时,得到的是长度为1的Series:
print(type(G)) # <class 'pandas.core.series.Series'>
而df1的列是长度为5的Series,两者运算时Pandas会按索引对齐。df2的索引只有0,所以只有df1中索引为0的行能和G、H匹配计算,其他行因为没有对应索引,结果就变成了缺失值。
修复方案
把G和H转换成标量值即可,有几种简单的方法:
- 使用
.iloc[0]提取第一个元素:
G = df2['a'].iloc[0] H = df2['b'].iloc[0]
- 使用
.item()方法(适用于单个元素的Series):
G = df2['a'].item() H = df2['b'].item()
- 使用
.values[0]提取底层数组的第一个元素:
G = df2['a'].values[0] H = df2['b'].values[0]
修复后的完整代码
import pandas as pd import numpy as np def mmInch(x): return(x/25.4) def Inchmm(x): return(x*25.4) def PsiBarg(x): return(x/14.5) def MB31G(L,W,T,S,D,P): Z=(mmInch(L))**2/(D*(mmInch(T))) M=np.where(Z>50,0.032*0.032*Z+3.3,(1+0.6275*Z-0.003375*Z**2)**(1/2)) F=P*((1-0.85*W)/(1-0.85*W/M)) I=2*F*mmInch(T)/D return(PsiBarg(I*S)) raw_data = {'L': [2,4,5,6,4], 'W':[0.1,0.12,0.15,0.3,0.4],'T': [12,12,12,15,15], 'S':[0.72,0.72,0.72,0.5,0.5]} df1 = pd.DataFrame(raw_data, columns = ['L', 'W', 'T', 'S',]) df2 = pd.DataFrame({'a':[28], 'b': [75000]}) # 提取标量值 G = df2['a'].iloc[0] H = df2['b'].iloc[0] df1['Result']=MB31G(df1['L'],df1['W'],df1['T'],df1['S'],G,H) print(df1)
这样运行后,df1['Result']的所有行都会得到正确的计算结果,而不只是第一行。
内容的提问来源于stack exchange,提问作者Purnomo Setyawendha
相关产品推荐
相关产品推荐

