有条件地替换数据框中选定列中的所有值 (pandas)

Conditional replacement of all values in selected columns in dataframe (pandas)

我有一个包含数百列和数百万行的数据框。我需要有条件地用另一个值替换所选列的值。如果我知道需要更改的列的索引或名称,最有效的方法是什么?

示例如下:

df = pd.DataFrame({'ID1':[0,1,2,3,4,5,6], 'ID2': [0,1,2,0,4,0,5], 'Value1':[0,1,6,0,4,7,0], 'Value2':[1,0,2,3,0,4,5] })

    ID1 ID2 Value1  Value2
0   0    0    0       1
1   1    1    1       0
2   2    2    6       2
3   3    0    0       3
4   4    4    4       0
5   5    0    7       4
6   6    5    0       5

我想将大于 0 的 Value1,Value2,...,ValueN 的值替换为 1。 请注意,应排除 ID1、ID2、...、IDN。

期望的输出:

   ID1  ID2 Value1  Value2
0   0    0    0       1
1   1    1    1       0
2   2    2    1       1      
3   3    0    0       1
4   4    4    1       0
5   5    0    1       1
6   6    5    0       1

dataframe 有数百列和数百万行....所以我想尽可能提高计算效率。

根据您有多少个 ValueN 列,您可以先构建一个列表:

cols = [x for x in df.columns if 'Value' in x]

一种有效的方法是使用 mask:

df[cols] = df[cols].mask(df[cols] > 0, 1)

或者,您可以尝试 np.where:

df[cols] = np.where(df[cols] > 1, 0, df[cols])

或者你可以试试这个:

df[ df.iloc[0: ,2:n] >0 ] = 1

n是你列索引号的最大值+1。

df[ df >0 ] = 1 可以检查 df 中的值是否 >0,将其替换为 1。

但是你希望前两列(ID1,ID2)保持不变,所以你可以使用df.iloc[0: ,2:n]将所有行和列[2]提取到[n],

参考:

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html