Pandas 使用熊猫,索引错误
我试图对数字进行四舍五入,如果它们的十进制数字以(125375625875)结尾,我将它们替换为(25,25,75,75)。 我的代码是: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.
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