有条件地替换数据框中选定列中的所有值 (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
我有一个包含数百列和数百万行的数据框。我需要有条件地用另一个值替换所选列的值。如果我知道需要更改的列的索引或名称,最有效的方法是什么?
示例如下:
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