"尝试在DataFrame"的切片副本上设置值。尝试设置数据帧值时发出警告

时间:2016-12-14 14:56:08

标签: python pandas dataframe

我只是想在pandas DataFrame中进行简单的值修改操作。

import pandas as pd
import numpy as np

x = np.linspace(1,10,10)
y = x * 2
z = [-1,-2,-3,4,5,6,7,8,9,10]

df = pd.DataFrame(columns=['x','y','z'])
df['x'] = x
df['y'] = y
df['z'] = z

for i in range(len(df['z'])):
    if df['z'].iloc[i] < 0:
        df['x'].iloc[i] *= -1
        df['y'].iloc[i] *= -1
        df['z'].iloc[i] *= -1

然而它警告:SettingWithCopyWarning: 尝试在DataFrame的切片副本上设置值 我不知道在这种情况下如何使用链式分配。

它给了我正确答案,但显然慢了。

由于

1 个答案:

答案 0 :(得分:1)

执行if循环是否更慢,所以最好避免它并尽可能使用矢量化pandas函数。

我认为您可以使用mask,如果True条件为-1多个:

df = df.mask(df['z'] < 0, df.mul(-1))
print (df)
      x     y   z
0  -1.0  -2.0   1
1  -2.0  -4.0   2
2  -3.0  -6.0   3
3   4.0   8.0   4
4   5.0  10.0   5
5   6.0  12.0   6
6   7.0  14.0   7
7   8.0  16.0   8
8   9.0  18.0   9
9  10.0  20.0  10

另一个解决方案是按条件选择,按-1选择多个:

df.loc[df['z'] < 0] *= -1
print (df)
      x     y   z
0  -1.0  -2.0   1
1  -2.0  -4.0   2
2  -3.0  -6.0   3
3   4.0   8.0   4
4   5.0  10.0   5
5   6.0  12.0   6
6   7.0  14.0   7
7   8.0  16.0   8
8   9.0  18.0   9
9  10.0  20.0  10