无法在 DataFrame where 子句中将大小为 4 的数组重塑为 (4,4) 形状

问题描述 投票:0回答:1

谁能给我解释一下这是怎么回事?这是一段代码。如果我的 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)

一切都在上面描述了。

pandas list tuples where-clause reshape
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.