Python可以有效地更新数据帧值
实现以下目标的最快方法是什么: 我正在使用Pandas数据帧(NxN),我想迭代每一行和每一个元素,检查元素是否大于行的平均值。如果它更大,我想将元素值更改为1 我使用以下公式计算平均值:Python可以有效地更新数据帧值,python,performance,pandas,dataframe,Python,Performance,Pandas,Dataframe,实现以下目标的最快方法是什么: 我正在使用Pandas数据帧(NxN),我想迭代每一行和每一个元素,检查元素是否大于行的平均值。如果它更大,我想将元素值更改为1 我使用以下公式计算平均值: mean_value = df.ix[elementid].mean(axis=0) 但是,使用嵌套循环迭代每个元素并检查它是否>=平均值非常慢。您可以先按行计数,然后与add和where进行比较1: print df a b c 0 0 1 2 1 0 1 2 2 1 1 2
mean_value = df.ix[elementid].mean(axis=0)
但是,使用嵌套循环迭代每个元素并检查它是否>=平均值非常慢。您可以先按行计数,然后与add和where进行比较1
:
print df
a b c
0 0 1 2
1 0 1 2
2 1 1 2
3 1 0 1
4 1 1 2
5 0 0 1
mean_value = df.mean(axis=1)
print mean_value
0 1.000000
1 1.000000
2 1.333333
3 0.666667
4 1.333333
5 0.333333
mask = df.ge(mean_value, axis=0)
print mask
a b c
0 False True True
1 False True True
2 False False True
3 True False True
4 False False True
5 False False True
print df.mask(mask, 1)
a b c
0 0 1 1
1 0 1 1
2 1 1 1
3 1 0 1
4 1 1 1
5 0 0 1
你正在访问每一个元素,是什么让你认为你可以做得比O(nm)更好。我只是希望pandas中有一个函数,如果元素大于平均值,则按行应用该值。该函数的作用与手动操作完全相同。您正在更改数组的每个元素,因此必须访问数组的每个元素。你不能这么快。我正在用python做循环,我认为pandas部分是用cython编写的,或者基于用cython编写的库,因此会更快。这是对
mask
和ge
的巧妙使用!非常优雅的解决方案+1除最终结果外,效果良好。你不是只想要df.mask(df.gt(df.mean(axis=1)),1)?很高兴能帮助你!祝你好运