将数组中特定列的值替换为相邻列中的值

Posted

技术标签:

【中文标题】将数组中特定列的值替换为相邻列中的值【英文标题】:Replace values from specific columns in array with values in the adjacent columns 【发布时间】:2020-04-13 20:35:37 【问题描述】:

我正在尝试降低以下问题的速度性能。我有一个数组,例如:

list1 = [0.564,0.011,0.560,-1.100,0.344,0.912,-0.983]
list2 = [0.0,1.0,1.0,0.0,0.0,0.0,-1.0]

list3 = [0.760,0.013,-0.580,1.120,0.144,-0.929,0.833]
list4 = [-1.0,1.0,0.0,1.0,0.0,0.0,1.0]

test_arr = np.column_stack((list1, list2,list3,list4))

这给出了:

我将始终有一列不同的浮点数(让我们将这些列称为“random_numbers”),然后是另一列仅包含 -1.0、0.0 和 1.0 值的组合(让我们将这些列称为“ones_zeros”)。

最终目标是将任何 -1.0 或 1.0(注意:不是 0.0)值替换为紧靠左边的值。对于此示例,输出将是:

目前,我正在将 numpy 数组转换为 pandas 并应用以下函数:

def replace_values(test_arr_df,random_numbers,ones_zeros):

    for cc in range(len(random_numbers)):

        test_arr_df[ones_zeros[cc]] = test_arr_df.apply(
            lambda row: row[random_numbers[cc]] if row[ones_zeros[cc]]==1 or row[ones_zeros[cc]]==-1
            else row[ones_zeros[cc]],axis=1

        )

    return test_arr_df

将其应用于我们的测试用例:

#Convert to dataframe
test_arr_df=pd.DataFrame(test_arr)

#Tell the function what is a variable column and what is a minmax column
variable_columns = [0,2]; minmax_columns = [1,3]

#Replace values
res_df = replace_values(test_arr_df,variable_columns,minmax_columns)

这个 pandas 方法有效,给出的结果与上面的示例输出相同。但是,它非常缓慢。在我的代码的其他部分,我通过保留 numpy 数组而不是切换到 pandas 成功地减少了处理时间,但我在这里没有成功。

所以,我的问题是,有没有办法使用 numpy 而不是 pandas 来做到这一点?或者也许是使用熊猫的更快方法?我无法在这方面取得进展,因为我经常索引错误的部分或无法替换正确的行/列。谢谢!

【问题讨论】:

【参考方案1】:

您可以使用np.where 替换值:

import numpy as np
import pandas as pd

list1 = [0.564,0.011,0.560,-1.100,0.344,0.912,-0.983]
list2 = [0.0,1.0,1.0,0.0,0.0,0.0,-1.0]

list3 = [0.760,0.013,-0.580,1.120,0.144,-0.929,0.833]
list4 = [-1.0,1.0,0.0,1.0,0.0,0.0,1.0]

df = pd.DataFrame(0:list1, 1:list2, 2:list3, 3:list4)

df.iloc[:, 1::2] = np.where(df.iloc[:, 1::2].isin([1, -1]), df.iloc[:, ::2], 0)
print(df.to_numpy())

打印:

[[ 0.564  0.     0.76   0.76 ]
 [ 0.011  0.011  0.013  0.013]
 [ 0.56   0.56  -0.58   0.   ]
 [-1.1    0.     1.12   1.12 ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -0.983  0.833  0.833]]

编辑:版本,其中列名被明确选择:

import numpy as np
import pandas as pd

list1 = [0.564,0.011,0.560,-1.100,0.344,0.912,-0.983]
list2 = [0.0,1.0,1.0,0.0,0.0,0.0,-1.0]

list3 = [0.760,0.013,-0.580,1.120,0.144,-0.929,0.833]
list4 = [-1.0,1.0,0.0,1.0,0.0,0.0,1.0]

df = pd.DataFrame('Pressure':list1, 'Pressure 0-1':list2, 'Temperature':list3, 'Temperature 0-1':list4)

df[['Pressure 0-1', 'Temperature 0-1']] = np.where(df[['Pressure 0-1', 'Temperature 0-1']].isin([1, -1]), df[ ['Pressure', 'Temperature'] ], 0)
print(df)

打印:

   Pressure  Pressure 0-1  Temperature  Temperature 0-1
0     0.564         0.000        0.760            0.760
1     0.011         0.011        0.013            0.013
2     0.560         0.560       -0.580            0.000
3    -1.100         0.000        1.120            1.120
4     0.344         0.000        0.144            0.000
5     0.912         0.000       -0.929            0.000
6    -0.983        -0.983        0.833            0.833

【讨论】:

感谢您的快速回复!快速提问,这适用于测试数组(如您所示),但不适用于我的“真实”数组。我认为这是因为我有不同的列名(想想压力、温度等)而不是 0、1、2、3 标签。是否可以调整此代码以解决此问题?直接在其上使用此代码不会立即改变任何内容。编辑:看起来应该可以,我需要尽快找出问题所在,然后我会回来! @SophieMayne 查看我的编辑。我添加了版本,您可以在其中明确命名列。【参考方案2】:

这里:

for x, y in np.argwhere(np.abs(test_arr) == 1.):
    test_arr[x, y] = test_arr[x, y-1]

之前:

[[ 0.564  0.     0.76  -1.   ]
 [ 0.011  1.     0.013  1.   ]
 [ 0.56   1.    -0.58   0.   ]
 [-1.1    0.     1.12   1.   ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -1.     0.833  1.   ]]

之后:

[[ 0.564  0.     0.76   0.76 ]
 [ 0.011  0.011  0.013  0.013]
 [ 0.56   0.56  -0.58   0.   ]
 [-1.1    0.     1.12   1.12 ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -0.983  0.833  0.833]]

逻辑:对于值1-1 的所有xy 坐标,替换为左侧值。

【讨论】:

感谢您的回复。我的问题应该更清楚 - 具有可变数字的列也可以包含 -1、0 和 1。如果我错了,请纠正我,但这看起来也会取代那些?我很快就得到了两个很好的答案,我会同时尝试它们,但现在另一个答案对我来说已经足够好了:) 它只会替换 -1 和 1

以上是关于将数组中特定列的值替换为相邻列中的值的主要内容,如果未能解决你的问题,请参考以下文章

根据c =字符数替换列中的值

将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值

将 pandas 列中的值替换为缺失键的默认值

根据另一列中的值更新 BigQuery 中的嵌套数组

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

用另一个表中同一列的值替换列中的字符串值