Pandas 使用熊猫,索引错误

Pandas 使用熊猫,索引错误,pandas,indexing,rounding,Pandas,Indexing,Rounding,我试图对数字进行四舍五入,如果它们的十进制数字以(125375625875)结尾,我将它们替换为(25,25,75,75)。 我的代码是: import pandas as pd inpExcelFile = 'Lat Lon Coordinates and soil.csv' #lat, lon gridCells = pd.read_csv(inpExcelFile) #inpExcelFile can be downloaded from "http://www.evernote.

我试图对数字进行四舍五入,如果它们的十进制数字以(125375625875)结尾,我将它们替换为(25,25,75,75)。 我的代码是:

import pandas as pd  

inpExcelFile = 'Lat Lon Coordinates and soil.csv'  #lat, lon
gridCells = pd.read_csv(inpExcelFile)
#inpExcelFile can be downloaded from "http://www.evernote.com/l/AWMD9Le15ytJmokhnUF8r84vtXVIsj2_lBQ/"

df = pd.DataFrame(columns=['lat_ext', 'lon_ext', 'lat_close', 'lon_close'])

for i in range(0, len(gridCells.index)):  

    if str(df.at[i, 'lat_ext'])== str('125'):
       df.at[i, 'lat_close'] =  float((str(gridCells.at[i, 'lat'])[:3]) + str('25'))
    if str(df.at[i, 'lat_ext'])== str('375'):
       df.at[i, 'lat_close'] = float((str(gridCells.at[i, 'lat'])[:3]) + str('25'))
    if str(df.at[i, 'lat_ext'])== str('625'):
       df.at[i, 'lat_close'] = float((str(gridCells.at[i, 'lat'])[:3]) + str('75'))
    if str(df.at[i, 'lat_ext'])== str('875'):
       df.at[i, 'lat_close'] = float((str(gridCells.at[i, 'lat'])[:3]) + str('75'))

for j in range(0, len(gridCells.index)):  

    if str(df.at[j, 'lon_ext'])== str('125'):
       df.at[j, 'lon_close'] =  float((str(gridCells.at[j, 'lat'])[:3]) + str('25'))
    if str(df.at[j, 'lon_ext'])== str('375'):
       df.at[j, 'lon_close'] = float((str(gridCells.at[j, 'lat'])[:3]) + str('25'))
    if str(df.at[j, 'lon_ext'])== str('625'):
       df.at[j, 'lon_close'] = float((str(gridCells.at[j, 'lat'])[:3]) + str('75'))
    if str(df.at[j, 'lon_ext'])== str('875'):
       df.at[j, 'lon_close'] = float((str(gridCells.at[j, 'lat'])[:3]) + str('75'))

df.to_excel('cikti' + '.xlsx')
我得到了这个错误:“ValueError:At基于非整数索引的索引只能有非整数索引器”


我该如何解决这个问题呢?

如果我理解正确,您需要将小数从x.125舍入到x.25,以此类推。我不确定是否有任何方法可以直接使用浮点数来实现这一点,但这里有一种有点笨重的方法(通过字符串转换)可以在每个步骤后使用打印输出来实现这一点:

import pandas as pd

# Create dummy dataframe
df = pd.DataFrame({
    "number": [1.125, 1.375, 1.625, 1.875]
})
print df
DF:

将数字转换为字符串以处理子字符串(本例中为小数)

DF:

创建包含要映射到的小数的列

df.loc[df.number_as_string.str.endswith(".125"), "number_decimal"] = ".25"
df.loc[df.number_as_string.str.endswith(".375"), "number_decimal"] = ".25"
df.loc[df.number_as_string.str.endswith(".625"), "number_decimal"] = ".75"
df.loc[df.number_as_string.str.endswith(".875"), "number_decimal"] = ".75"
print df
DF:

使用字符串,获取小数点之前的数字部分,并将您喜欢的小数添加到其中

df["number_rounded"] = df.number_as_string.str.split(".").str[0] + df.number_decimal
print df
DF:

将该列转换为浮点数(从字符串)

最终DF:

   number number_as_string number_decimal  number_rounded
0   1.125            1.125            .25            1.25
1   1.375            1.375            .25            1.25
2   1.625            1.625            .75            1.75
3   1.875            1.875            .75            1.75

我通过你的回答达到了我的目标,谢谢,但是我的剧本呢?你能看到什么吗?不客气。对不起,你是什么意思?明白了吗?老实说,我认为你的实施非常不成功。您应该尽量避免pandas中的for循环,因为向量化操作要快得多,坦率地说,整个pandas点都是如此。至少,把你所有的逻辑放在同一个for循环中,你现在将同样的东西循环两次。
df.loc[df.number_as_string.str.endswith(".125"), "number_decimal"] = ".25"
df.loc[df.number_as_string.str.endswith(".375"), "number_decimal"] = ".25"
df.loc[df.number_as_string.str.endswith(".625"), "number_decimal"] = ".75"
df.loc[df.number_as_string.str.endswith(".875"), "number_decimal"] = ".75"
print df
   number number_as_string number_decimal
0   1.125            1.125            .25
1   1.375            1.375            .25
2   1.625            1.625            .75
3   1.875            1.875            .75
df["number_rounded"] = df.number_as_string.str.split(".").str[0] + df.number_decimal
print df
   number number_as_string number_decimal number_rounded
0   1.125            1.125            .25           1.25
1   1.375            1.375            .25           1.25
2   1.625            1.625            .75           1.75
3   1.875            1.875            .75           1.75
df["number_rounded"] = df.number_rounded.map(float)
print df
   number number_as_string number_decimal  number_rounded
0   1.125            1.125            .25            1.25
1   1.375            1.375            .25            1.25
2   1.625            1.625            .75            1.75
3   1.875            1.875            .75            1.75