【问题标题】:Pandas lambda function raised an indexing errorPandas lambda 函数引发索引错误
【发布时间】:2021-09-20 18:56:01
【问题描述】:

我有一个数据框 df,想将 b 列的值重新分配给最后一列。逻辑如下:如果“b”列值大于或等于前一行“a”列值,则将“b”值重新赋值为“green”,否则为“red”。我的代码引发了索引错误:索引器过多。不知道我的代码有什么问题。任何帮助将不胜感激。

value = [[10, 95, 10, 32],[22, 12, 3, 15],[28, 25, 5, 29],[30, 11, 66, 16]]
df = pd.DataFrame(value, columns=['a', 'b', 'c', 'd'])

for j in range(2, len(df.columns)):
    df.iloc[:,j] = df.apply(lambda x: "green" if x.iloc[:,j] >= (x["b"].shift(periods = 1)) else "red", axis = 1)

预期结果是:

 a     b     c     d

10   nan   nan   nan
22  green  red   green
28  green  red   green
30  red   green  red

【问题讨论】:

  • 我对逻辑有点不清楚。是否所有列都与a 进行比较?如果是这样,C 的最后一行不是 66 >= 28 的绿色吗?你能详细说明为什么期望值是预期的吗?
  • 具体问题是x 是一个系列并且只有一个维度。所以它会类似于x.iloc[j],但随后您会引发其他错误。
  • 抱歉,这是一个拼写错误。我编辑了它。
  • 谢谢亨利。我不明白为什么这里的 x 是一个系列。我在df上应用了lambda函数,x不是指数据框df吗?
  • 所以x 指的是DataFrame 的 (axis=1)。这是一维(系列),而不是像 DataFrame 这样的二维数据。

标签: python pandas dataframe indexing lambda


【解决方案1】:

让我们尝试使用np.where 并比较Series.ge 的列位置与ashift 的位置:

import numpy as np

df.iloc[:, 1:] = np.where(df.iloc[:, 1:].ge(df['a'].shift(), axis=0),
                          'green',
                          'red')
df.iloc[0, 1:] = np.nan

df:

    a      b      c      d
0  10    NaN    NaN    NaN
1  22  green    red  green
2  28  green    red  green
3  30    red  green    red

将 nan 放回第一行的第二个分配是必要的,因为 nan >= 值是 False,所以第一行最终将全部是 red


根据移位系列的位置NaN 重新添加 NaN 值可能是有益的(这允许不同类型的移位,但不会改变上述输出)

s = df['a'].shift()
df.iloc[:, 1:] = np.where(df.iloc[:, 1:].ge(s, axis=0), 'green', 'red')
df.iloc[s.isna(), 1:] = np.nan

apply + map 的(较慢)选项:

s = df['a'].shift()
df.iloc[:, 1:] = df.iloc[:, 1:].apply(
    lambda x: x.ge(s).map({True: 'green', False: 'red'})
)
df.iloc[s.isna(), 1:] = np.nan

或者apply + np.where:

s = df['a'].shift()
df.iloc[:, 1:] = df.iloc[:, 1:].apply(
    lambda x: np.where(x.ge(s), 'green', 'red')
)
df.iloc[s.isna(), 1:] = np.nan

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2021-10-30
    • 2019-11-16
    • 2018-12-28
    相关资源
    最近更新 更多