谁能给我解释一下这是怎么回事?这是一段代码。如果我的 DataFrame 的长度恰好为 4,则 try 子句中的语句会引发异常。如果我制作 4 以外的任何其他大小的数据框,它就可以工作。此外,如果我删除“temp2”列并创建长度为 3 的 DataFrame,它也会产生异常 cannot reshape 大小为 3 的数组为形状 (3,3)。我想要做的就是为值陈旧性小于或等于 1 的列置零。我宁愿使用该列表,也不愿创建一个全零的新 DataFrame。预先感谢。
import pandas as pd
zeroeble_cols = ['volume','trade_count', 'temp', 'temp2']
stalenesses = [0.3, 0.4, 1.2, 3.4]
length = len(stalenesses)
df = pd.DataFrame(data = {'volume' : [10 for i in range(length)],
'trade_count' : [10 for i in range(length)],
'temp' : [1 for i in range(length)],
'temp2' : [1 for i in range(length)],
'staleness' : stalenesses})
try:
df[zeroeble_cols] = df[zeroeble_cols].where(df['staleness'] <= 1, [0 for i in range(len(zeroeble_cols))], axis = 1)
except Exception as e:
print(f'Exception: {e}')
zeroDF = pd.DataFrame(data = {k : [0] for k in zeroeble_cols})
df[zeroeble_cols] = df[zeroeble_cols].where(df['staleness'] <= 1, zeroDF, axis = 1)
print(df)
一切都在上面描述了。
在
try
块中,您有一个长度为 4 的 DataFrame,并且 where
方法正在尝试将 list
[0, 0, 0, 0]
重塑为 (4, 4)
的形状,以匹配 DataFrame 的选定子集的形状,导致错误。
where
,您应该将 [0 for i in range(len(zeroeble_cols))]
替换为 0
(默认)上的 axis=0
,Pandas 会将结果应用到所选列 (zeroeble_cols
) 上的所有相应行。此外,您应该在条件中包含您想要保留原样的行,Pandas 将根据条件更改其他行:
df[zeroeble_cols] = df[zeroeble_cols].where(df["staleness"] > 1, 0)
mask
,它与 where
相反,因此您可以在条件中包含要更改的行:
df[zeroeble_cols] = df[zeroeble_cols].mask(df["staleness"] <= 1, 0)
loc
,我更喜欢:
df.loc[df["staleness"] <= 1, zeroeble_cols] = 0
所有这些选项都会产生相同的结果:
volume trade_count temp temp2 staleness
0 0 0 0 0 0.3
1 0 0 0 0 0.4
2 10 10 1 1 1.2
3 10 10 1 1 3.4