【问题标题】:pandas numpy KeyError: "['1' '2' '3' '4'] not in index"pandas numpy KeyError:“['1''2''3''4'] 不在索引中”
【发布时间】:2022-01-06 17:22:48
【问题描述】:

我有一个数据框,你可以通过运行这段代码来获得它:

import numpy as np
import pandas as pd
from io import StringIO

df4s = """
   LowerAge    age    1       2      3      4 
0  2            3     o.234   o.234  o.234  o.234
1  3            4     o.234   o.234  o.234  o.234
2  4            2     o.234   o.234  o.234  o.234      
3  5            3     o.234   o.234  o.234  o.234         
"""
df4 = pd.read_csv(StringIO(df4s.strip()), sep='\s+')

df4

输出是:

  LowerAge  age   1       2       3       4
0   2       3     o.234   o.234   o.234   o.234
1   3       4     o.234   o.234   o.234   o.234
2   4       2     o.234   o.234   o.234   o.234
3   5       3     o.234   o.234   o.234   o.234

现在的逻辑是这样的:对于每一行,如果LowerAge-1

第一行LowerAge-1等于1且小于age,则'1'列的值(因为LowerAge-1等于1)将等于1,

第二行LowerAge-1等于2且小于age,则'2'列的值为1。

最终的输出应该是:

  LowerAge  age  '1'     '2'     '3'     '4'
0   2       3     1      o.234   o.234   o.234
1   3       4     o.234  1       o.234   o.234
2   4       2     o.234  o.234   o.234   o.234
3   5       3     o.234  o.234   o.234   o.234

我的代码是:

lower_v=df4['LowerAge'].values - 1

df4[lower_v.astype(str)]=np.where(lower_v<df4['age'],1,df4[lower_v.astype(str)])

错误:

---> 19 df4[lower_v.astype(str)]=np.where(lower_v<df4['age'],1,df4[lower_v.astype(str)])
KeyError: "['1' '2' '3' '4'] not in index"

有朋友可以帮忙吗?

【问题讨论】:

  • 如果您想逐行处理 pandas 数据帧,请使用 .iloc
  • 感谢您的回复,能否将您的回复作为答案发布,以便我查看?
  • 至少在这个例子中,列标签是如此混乱,因为它们不仅仅是字符串'1',还有带引号的字符串''1'',所以如果你需要要通过标签实际引用它们,您需要df["'1'"]

标签: python pandas dataframe numpy


【解决方案1】:

不会修复您的代码,但当前错误是由于您的列是带有引号的 '1''2'。删除 df 定义中的这些引号可以消除此错误,但您的代码也没有返回预期结果:

df4s = """
   LowerAge    age    1      2     3       4  
0  2            3     o.234   o.234  o.234  o.234
1  3            4     o.234   o.234  o.234  o.234
2  4            2     o.234   o.234  o.234  o.234      
3  5            3     o.234   o.234  o.234  o.234         
"""

【讨论】:

  • 谢谢,我更新了我的问题。
  • 最好在 cmets 中提及
【解决方案2】:

我更喜欢做切片来解决这个问题,所以你可以试试这个:

for i in range(len(df4)):
    index_age = df4['LowerAge'].iloc[i]-1
    if index_age<df4['age'].iloc[i]:
        df4.iloc[i,index_age+1] = 1

结果:

【讨论】:

  • 谢谢你的回复,看起来很不错,我唯一的演唱会是,如果文件很大,这个方法可能运行很慢,有什么numpy方法可以做到吗?跨度>
【解决方案3】:

你可以这样做:

def fun(x):
  if x['LowerAge']-1<x['age']:
    if x['LowerAge']-1<4:
      x[str(x['LowerAge']-1)]=1
  return x
df4.apply(fun,axis=1)

输出:

  LowerAge  age  '1'     '2'     '3'     '4'
0   2       3     1      o.234   o.234   o.234
1   3       4     o.234  1       o.234   o.234
2   4       2     o.234  o.234   o.234   o.234
3   5       3     o.234  o.234   o.234   o.234

进入时间复杂度线性复杂度是必须的,因为我们需要检查每一行。可能有更好的解决方案,但此解决方案不会花费您太多。

【讨论】:

  • 在第二个条件中删除 4 并使其应用于任意数量的列的任何方法,即if str(x['LowerAge'] - 1) in df4.columns?
  • 是的,我们可以直接在 if 外部编写语句 x[str(x['LowerAge']-1)]=1 而不使用那个 if 语句。我们所做的是检查是否存在具有该名称的列以避免键错误,以防您确定每个数字都作为列存在,然后您可以跳过该 if 语句并将其内容写入它之外。
  • 如果 x['LowerAge']-1
猜你喜欢
  • 2016-11-22
  • 2018-04-30
  • 2019-01-06
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2013-03-27
相关资源
最近更新 更多