Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python可以有效地更新数据帧值_Python_Performance_Pandas_Dataframe - Fatal编程技术网

Python可以有效地更新数据帧值

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

实现以下目标的最快方法是什么:

我正在使用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
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)?很高兴能帮助你!祝你好运