在这种情况下,我不了解熊猫的行为。显然,问题出在第3行中,其中A列的值为负,这导致了试图提高小数幂的数学问题。
我使用df.loc限制了要由条件A> 1运行此np.power的行。从第0行C列的NaN得出的结果很明显,过滤器工作正常,并且结果数据帧中的所有值均符合预期,但由于出现了某些原因,np.power显然仍在计算第3行,因此出现了错误。
您能帮助我理解为什么会发生这种情况以及如何改进代码以避免错误吗?
data = [{'A': 1, 'B': 10},
{'A': 2, 'B': 10},
{'A': 3, 'B': 10},
{'A': -1, 'B': 10}]
df = pd.DataFrame(data)
df
Out[4]:
A B
0 1 10
1 2 10
2 3 10
3 -1 10
df['C'] = df.loc[df.A > 1, 'A'] * np.power(df['A'],0.3)
df
/home/meteoadriatic/.local/lib/python3.5/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in power
"""Entry point for launching an IPython kernel.
Out[5]:
A B C
0 1 10 NaN
1 2 10 2.462289
2 3 10 4.171168
3 -1 10 NaN
答案 0 :(得分:1)
这样做的时候
np.power(df['A'],0.3)
df['A']
仍然引用整列。
相反,您可以使用mul
来避免该警告:
df['C'] = np.power(df.loc[df.A > 1, 'A'], 0.3).mul(df.A)
>>> df
A B C
0 1 10 NaN
1 2 10 2.462289
2 3 10 4.171168
3 -1 10 NaN
另一个选择是再次选择:
df['C'] = df.loc[df.A > 1, 'A'] * np.power(df.loc[df.A>1,'A'],0.3)