如果列的值为零,则该行上的其他列的值为零

时间:2020-09-30 09:12:09

标签: python-3.x pandas dataframe

这是我的输入

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个文件执行此操作。 请给我建议一个解决方案,以最少的时间执行此操作

1 个答案:

答案 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)