我只是想在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的切片副本上设置值 我不知道在这种情况下如何使用链式分配。
它给了我正确答案,但显然慢了。
由于
答案 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