这是我的输入
Df
A B C D
0 0 5 7 9
1 6 7 2 8
2 2 8 6 3
3 0 9 6 7
在DataFrame
上方,如果值Df ['A']为零,则其他列值为零
我期望的输出
Df
A B C D
0 0 0 0 0
1 6 7 2 8
2 2 8 6 3
3 0 0 0 0
我的Df为[8760行x 2列],我必须对122个文件执行此操作。 请给我建议一个解决方案,以最少的时间执行此操作
答案 0 :(得分:2)
您可以通过掩码为集0
使用索引:
df[df['A'] == 0] = 0
print (df)
A B C D
0 0 0 0 0
1 6 7 2 8
2 2 8 6 3
3 0 0 0 0
替代方法是使用DataFrame.mask
:
df = df.mask(df['A'] == 0, 0)
如果性能很重要,请使用DataFrame
构造函数和numpy.where
:
df = pd.DataFrame(np.where(df['A'].to_numpy()[:, None] == 0, 0, df),
index=df.index,
columns=df.columns)
print (df)
A B C D
0 0 0 0 0
1 6 7 2 8
2 2 8 6 3
3 0 0 0 0
1万行,4列,50%匹配数据的示例数据的性能:
#10k rows
df = pd.concat([df] * 2500, ignore_index=True)
In [101]: %timeit df[df['A'] == 0] = 0
465 µs ± 40.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [103]: %timeit df.mask(df['A'] == 0, 0)
2.56 ms ± 419 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [105]: %timeit pd.DataFrame(np.where(df['A'].to_numpy()[:, None] == 0, 0, df), index=df.index, columns=df.columns)
123 µs ± 666 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)