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

2024-05-23 23:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[[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.        ]]

我要遍历每一行,检查条目是否小于1,如果小于1,则取该条目并将条目添加到其右侧。例如, 如果我有

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

第一个条目是0.5,小于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)

但我有个错误:

AttributeError: ("'numpy.float64' object has no attribute 'iloc'", 'occurred at index a1')

请注意,adjusted_PITI_nums1是一个数据帧,其矩阵内容和头如下所示:

enter image description here


Tags: inforreturndef条目range矩阵例子
2条回答

以下是一个仅适用于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. ]])

注意:这种方法假设特定列中的所有值都小于右侧的值。你知道吗

举个例子:

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)

输入:

        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

注意第2列中的输入。你知道吗


Edit:DataFrame.transform()是一个更好的候选者,因为它不会创建新的数据帧。同样,类似于kmario23的并行工作:

def modify_row(row):
    mask = row[:-1] < 0.5
    row[:-1] += row[1:]* mask

# raw = True makes row to be an np.array
df.transform(lambda row: modify_row(row), axis=1, raw=True)

相关问题 更多 >