【发布时间】: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