Python 试图将if-else条件置于数据帧中的列中,但获取Keyerror

Python 试图将if-else条件置于数据帧中的列中,但获取Keyerror,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理一个大数据集。一列是价格列。我试图用以下代码对price列的值进行四舍五入: for i in range(0,len(df5['price'])): if df5['price'][i]>=0 and df5['price'][i]<=50: df5['price'][i] = 50 elif df5['price'][i]>50 and df5['price'][i] <= 100: df5['price'][

我正在处理一个大数据集。一列是价格列。我试图用以下代码对price列的值进行四舍五入:

for i in range(0,len(df5['price'])):
    if df5['price'][i]>=0 and df5['price'][i]<=50:
        df5['price'][i] = 50
    elif df5['price'][i]>50 and df5['price'][i] <= 100:
        df5['price'][i] = 100
    elif df5['price'][i]>100 and df5['price'][i]<=150:
        df5['price'][i]=150
    elif df5['price'][i]>150 and df5['price'][i]<=200:
        df5['price'][i]=200
    elif df5['price'][i]>200 and df5['price'][i]<=250:
        df5['price'][i]=250
    elif df5['price'][i]>250 and df5['price'][i]<=300:
        df5['price'][i]=300
    elif df5['price'][i]>300 and df5['price'][i]<=350:
        df5['price'][i]=350
    elif df5['price'][i]>350 and df5['price'][i]<=400:
        df5['price'][i]=400
适用于范围内的i(0,len(df5['price']):
如果df5['price'][i]>=0和df5['price'][i]50和df5['price'][i]100和df5['price'][i]150和df5['price'][i]200和df5['price'][i]250和df5['price'][i]300和df5['price'][i]350和df5['price'][i]2如果df5['price'][i]>=0和df5['price'[i]50和df5['price'][i]868和df5['price']
869
870如果不是标量(结果):
获取值中的~\Anaconda3\lib\site packages\pandas\core\index\base.py(self、series、key)
4373尝试:
4374返回自引擎。获取值(s,k,
->4375 tz=getattr(series.dtype,“tz”,无))
4376键错误除外,如e1:
4377如果len(self)>0且(self.holds_integer()或self.is_boolean()):
pandas/_libs/index.pyx在pandas中。_libs.index.IndexEngine.get_value()
pandas/_libs/index.pyx在pandas中。_libs.index.IndexEngine.get_value()
pandas/_libs/index.pyx在pandas中。_libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi在pandas._libs.hashtable.Int64HashTable.get_item()中
pandas/_libs/hashtable_class_helper.pxi在pandas._libs.hashtable.Int64HashTable.get_item()中
关键字错误:35

这里怎么了?谁能解释一下吗。提前感谢。

首先,不要在熊猫数据帧上运行循环,即使这样做有效,也会非常缓慢。如果必须,则使用
pandas.DataFrame.iterrows
方法,该方法比循环快得多,但仍然非常慢

对于假设铲斗等间距的问题,可以执行以下操作:

将numpy导入为np
df5['price']=(np.数字化(df5.price,np.arange(045050))*50

要回答您的问题,为什么会出现
KeyError
,可能是因为您的数据帧索引处于关闭状态。考虑将<代码> DF5[价格] [I] /代码>改为代码> DF5[价格]。ILOC[i] /代码>

< P>首先,不要在BANDA数据文件上运行循环,即使这样工作也会非常缓慢。如果必须,则使用
pandas.DataFrame.iterrows
方法,该方法比循环快得多,但仍然非常慢

对于假设铲斗等间距的问题,可以执行以下操作:

将numpy导入为np
df5['price']=(np.数字化(df5.price,np.arange(045050))*50

要回答您的问题,为什么会出现
KeyError
,可能是因为您的数据帧索引处于关闭状态。考虑将<代码> DF5[价格] [I] /代码>改为代码> DF5[价格]。ILOC[i] /代码> < /P> < P>如果您的目标是在代码>价格> /Cuff>列中围绕最近50的值,也可以尝试:

import numpy as np

df5['price'] = df5.price.apply(lambda val: np.ceil(val/50)*50)

如果您的目标是将
price
列中的值四舍五入到最接近的50,您也可以尝试以下方法:

import numpy as np

df5['price'] = df5.price.apply(lambda val: np.ceil(val/50)*50)

不要为此使用循环,
apply()。这个解决方案比Bishwarup Bhattacharjee的慢,可能不是最优的,因为数据集太大了。这里是否需要
apply()
?我很确定@Erfan建议的
df['price']//50*50+50
更好。@AMC,是的,Erfan的建议肯定更好。我不太会回答问题,你能帮我一点忙吗?在这种情况下,最佳做法是什么?我应该修改、删除我的答案还是保持原样?顺便说一句,这个解决方案比Bishwarup Bhattacharjee的慢,可能不是最优的,因为数据集真的很大。这里是否需要
apply()
?我很确定@Erfan建议的
df['price']//50*50+50
更好。@AMC,是的,Erfan的建议肯定更好。我不太会回答问题,你能帮我一点忙吗?在这种情况下,最佳做法是什么?我应该修改、删除我的答案还是保持原样?