我有一个看起来像这样的矩阵:
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)
是一个数据帧,其矩阵内容和标题如下:
答案 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. ]])
注意:此方法假定特定列中的所有值均小于右侧的值。