给定条件更新矩阵中的条目

时间:2019-01-11 18:38:48

标签: python pandas numpy matrix

我有一个看起来像这样的矩阵:

Content-Type

我想遍历每一行并检查条目是否小于1,如果是,那么我将该条目添加到它的右边。例如, 假设我有

charset=UTF-8

第一个条目是0.5,小于0,因此我们现在有了

[[1.10629335 0.         2.21258671 ... 0.         0.         0.        ]
 [0.         0.         0.         ... 0.         0.         0.        ]
 [1.25571599 1.25571599 0.         ... 0.         0.         0.        ]
 ...
 [1.         1.41956932 1.49244153 ... 0.         0.         0.        ]
 [0.         0.         0.         ... 2.10342705 0.         1.05171352]
 [0.         0.         0.         ... 0.         0.         0.        ]]

我认为这使得例子相对清晰。现在如何将其应用于我拥有的整个矩阵?

这是我尝试过的:

[[ 0.5 ,  1]
 [0  ,   0]]

但是我得到这个错误:

[[ 1.5 ,  1]
 [0  ,   0]]

请注意,def modify_PITI_nums(adjusted_PITI_nums1): for i in range(1,col_num): if adjusted_PITI_nums1.iloc[0][i] <1: return adjusted_PITI_nums1.iloc[:,i]+ (adjusted_PITI_nums1.iloc[:,i+1] -1) else: return adjusted_PITI_nums1.iloc[:,i] adjusted_PITI_nums1.apply(lambda row: modify_PITI_nums(row['nper_0']), axis = 1) 是一个数据帧,其矩阵内容和标题如下:

enter image description here

2 个答案:

答案 0 :(得分:1)

这是一个例子:

products_controller.rb:

输入:

  def create
    product_user_id_param = { "user_id": current_user.id.to_s }
    @product = Product.new(product_user_id_param.merge(params[:product_name]))
    ...
  end

给予:

def modify_row(row):
    for i in range(len(row)-1):
        if row[i] < 0.5:
            row[i] += row[i+1]
    return row    

df = df.apply(lambda row: modify(row), axis=1)

请注意第2列中的输入。


编辑: 0 1 2 3 0 0.939943 0.891797 0.491610 0.827307 1 0.500028 0.756851 0.545806 0.575469 2 0.880074 0.662705 0.205046 0.269572 3 0.970287 0.731664 0.528683 0.785946 是一个更好的选择,因为它不会创建新的数据框。另外,像 0 1 2 3 0 0.939943 0.891797 1.318918 0.827307 1 0.500028 0.756851 0.545806 0.575469 2 0.880074 0.662705 0.474618 0.269572 3 0.970287 0.731664 0.528683 0.785946 这样的parallel可以工作:

DataFrame.transform()

答案 1 :(得分:1)

这是仅适用于NumPy的解决方案:

In [51]: arr  
Out[51]: 
array([[0.5, 1. ],
       [0. , 0. ]])

# generate a boolean mask
In [52]: mask = (arr < 1)
Out[52]: 
array([[ True, False],
       [ True,  True]])

# go over all the columns and check for condition
In [53]: for col in range(mask.shape[1]): 
    ...:     if np.all(mask[:, col]): 
    ...:         arr[:, col] = arr[:, col] + arr[:, col+1] 
    ...:     else: 
    ...:         continue 

In [54]: arr          
Out[54]: 
array([[1.5, 1. ],
       [0. , 0. ]])

注意:此方法假定特定列中的所有值均小于右侧的值。