Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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中找到每n(50)行的模式?_Python_Pandas_Dataframe_Mode - Fatal编程技术网

如何在python中找到每n(50)行的模式?

如何在python中找到每n(50)行的模式?,python,pandas,dataframe,mode,Python,Pandas,Dataframe,Mode,我有一个8列80万行的数据框。我想在一个单独的数据帧中找到特定列(例如第5列)每50行的模式。我的方法是这样的 for i in range(1, len(data['Column5'])-1) : splitdata = (data['Column5'][i:(i+49)]) mode_pressure[j] = splitdata.mode() i = i+50 j = j+1 但我得到“'int'对象不支持项分配”错误。我的df如下所示 Col1 Col2 Col

我有一个8列80万行的数据框。我想在一个单独的数据帧中找到特定列(例如第5列)每50行的模式。我的方法是这样的

for i in range(1, len(data['Column5'])-1) :
  splitdata = (data['Column5'][i:(i+49)])  
  mode_pressure[j] = splitdata.mode()
  i = i+50
  j = j+1
但我得到“'int'对象不支持项分配”错误。我的df如下所示

Col1 Col2   Col3     Col4        Col5   Col6    Col7 Col8
0   612458  6715209 671598606   101043  -56     224 16560   
1   612458  6715210 671598706   101038  -264    256 16696   
2   612458  6715211 671598806   101038  -144    192 16528   
3   612458  6715212 671598906   101043  -136    200 16576   
4   612458  6715213 671599006   101037  -232    104 16576   
5   612458  6715214 671599106   101038  -88     264 16904   
6   612458  6715215 671599206   101040  -200    176 16808
7   612458  6715212 671598906   101043  -136    200 16576   
8   612458  6715213 671599006   101037  -232    104 16576   
9   612458  6715214 671599106   101040  -88     264 16904   
10  612458  6715215 671599206   101040  -200    176 16808

Output: (assume mode of 5 values)
df_mode : 101038, 101048
我在R中编写了相同的函数,R返回最新(最后)的模式值,作为每组50的单个输出

i=1
j=1
while(i<=length(data$Column5)-1) {
  splitdata<-data$Column5[i:(i+49)]  
  mode_value[j] = modeest::mfv(splitdata)
  i=i+50
  j=j+1
}
i=1
j=1

而(i我认为numpy arange需要
groupby
来获得更一般的解决方案,例如,使用
DatetimeIndex
和楼层划分进行良好的工作:

df = df.groupby(np.arange(len(df)) // 50)['Col5'].apply(lambda x: x.mode())

可能存在多个值,因此可能的解决方案是
Multiindex

df = df.groupby(np.arange(len(df)) // 5)['Col5'].apply(lambda x: x.mode())
print (df)
0  0    101038
   1    101043
1  0    101040
2  0    101040
Name: Col5, dtype: int64
或列表:

df = df.groupby(np.arange(len(df)) // 5)['Col5'].apply(lambda x: x.mode().tolist())
print (df)
0    [101038, 101043]
1            [101040]
2            [101040]
Name: Col5, dtype: object
我认为另一个解决方案(使用
滚动
)可能是:

from scipy.stats import mode
df_mode = df['Col5'].rolling(window=50, min_periods=1).apply(lambda x: mode(x)[0])[::50]

酷!这看起来很简单。如果有多个模式值,我需要单独获取最新(最后)的值。有办法吗?@veggie crunch burger。我的笔记本电脑用完了,但是
x.mode().tolist()[-1]
x.mode().iloc[-1]
应该有效。当然!让我试试看,然后再回来。非常有效!非常感谢!顺便说一句,你能告诉我使用for()循环的方法有什么问题吗?我觉得逻辑看起来不错,但我发现错误“int”对象不支持项分配在我看来,您需要在循环之前定义第一个empy列表
mode\u pressure=[]
,然后将每个值更改
mode\u pressure[j]=splitdata.mode()
附加到
mode\u pressure.append(splitdata.mode())
Cool!这同样有效!谢谢。但是第一个答案比“滚动”更快“窗口。第一次大约需要3-4秒,第二次大约需要90秒。但是这会给一些有滚动窗口的有趣应用程序。是的,事实上,通过这种方式,您仍然可以在所有窗口上应用该模式(比其他解决方案多50倍)