pandas 为什么会出现TypeError(-的操作数类型不受支持):“str”和“int”),而数据是数值型的?

4szc88ey  于 2023-03-11  发布在  其他
关注(0)|答案(2)|浏览(168)

我想创建一个新列,并根据 Dataframe 的其他列值计算值。输入数据是一个大型的.csv文件,其中包含多年来每天每小时的温度值。 Dataframe 如下所示:

HH      T        date  t_min  t_max
0   8   94.0  1991-04-01     81    110
1   9   90.0  1991-04-01     81    110
2  10   95.0  1991-04-01     81    110
3  11  108.0  1991-04-01     81    110
4  12  110.0  1991-04-01     81    110
5  13  109.0  1991-04-01     81    110
6  14   81.0  1991-04-01     81    110
7  15   85.0  1991-04-01     81    110
8  16   85.0  1991-04-01     81    110
9  17   87.0  1991-04-01     81    110

HH =小时; T =小时温度;t_min =一天中的最低温度;t_max =最高日温
我尝试使用以下代码计算新列“HTD”(每小时温度偏差):

import pandas as pd
df_t = pd.read_csv('file.csv')

# calcualation = ( Tu - Tmin ) / ( Tmax - Tmin ) * (Tmax - Tmin)
df_t[ 'HTD'] = (df_t.T - df_t.t_min) / (df_t.t_max - df_t.t_min) * (df_t.t_max - df_t.t_min)

这将导致类型错误:- 不支持的操作数类型:'str'和'int'在最后一行。问题似乎出在T列,因为当我使用df_t.t_min而不是df_t. T时,代码运行。我检查了T列的数据:

#First check: 0 values
df_t.isnull().sum()

#Second check: non-numerical values:
result = df_t.applymap(np.isreal)
for value in result['T']:
    if value == False:
        print(value)

它没有显示空值,也没有报告非数字值。我还尝试使用.astype()来确保数据是正确的类型。
尝试解决此问题的最佳方案是什么?(如果我的问题不完整或不清楚,请道歉,这是我第一次提出此问题)

qyswt5oh

qyswt5oh1#

通常你可以使用df.<colname>作为df['colname']的快捷方式,但是df.T是Pandas中的property,它返回 Dataframe 的转置(行变成列,列变成行)。
举个简单的例子:

df = pd.DataFrame({"Something": [1,2,3], 'T': [35,36,37]})
df.T # returns the transpose, not the 'T' column

只需使用方括号访问列即可解决此问题:

df["T"] # returns the column you want

或者通过重命名你的列,使其不与内置的panda数据框属性或方法冲突(其他例子包括df.shape,df.size等;使用dir(df)查看所有潜在的碰撞!)
一般来说,方括号访问是安全的,如果有点不方便,因为你将保证永远不会冲突的名称。我会坚持.attribute访问只是作为一个快捷方式或名称,我肯定不会冲突(列与大写名称的例子)

umuewwlo

umuewwlo2#

不要使用df_t.T,它会调换 Dataframe ,解决方法如下:

import pandas as pd

df_t = pd.DataFrame({"HH":[8,9,10,11,12,13,14,15,16,17],
               "T":[94.0, 90.0, 95.0,108.0,110.0,109.0,81.0,85.0,85.0,87.0],
               "date":["1991-04-01", "1991-04-01", '1991-04-01', '1991-04-01', '1991-04-01', '1991-04-01','1991-04-01','1991-04-01','1991-04-01','1991-04-01'],
               "t_min":[81,81,81,81,81,81,81,81,81,81],
               "t_max": [110,110,110,110,110,110,110,110,110,110]
}
                  )

# calcualation = ( Tu - Tmin ) / ( Tmax - Tmin ) * (Tmax - Tmin)
df_t[ 'HTD'] = (df_t['T'] - df_t.t_min) / (df_t.t_max - df_t.t_min) * 
(df_t.t_max - df_t.t_min)
print(df_t.head())

HH      T        date  t_min  t_max   HTD
0   8   94.0  1991-04-01     81    110  13.0
1   9   90.0  1991-04-01     81    110   9.0
2  10   95.0  1991-04-01     81    110  14.0
3  11  108.0  1991-04-01     81    110  27.0
4  12  110.0  1991-04-01     81    110  29.0

相关问题