【问题标题】:How to find mode of every n (50) rows in python?如何在python中查找每n(50)行的模式?
【发布时间】:2018-10-19 04:34:14
【问题描述】:

我有一个包含 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
}

【问题讨论】:

    标签: python pandas dataframe mode


    【解决方案1】:

    我认为另一种解决方案(rolling)可能是这样的:

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

    【讨论】:

    • 酷!这也有效!谢谢。但是第一个答案比“滚动”窗口要快。第一个大约需要 3-4 秒,这个大约需要 90 秒。但这提供了一些有趣的滚动窗口应用程序..
    • 是的,实际上通过这种方式您仍然可以在所有窗口上应用该模式(比其他解决方案多 50 倍)
    【解决方案2】:

    我认为需要 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
    

    【讨论】:

    • 酷!这看起来很简单。如果有多个模式值,我需要单独获取最新(最后一个)值。有办法吗?
    • @veggie 紧缩汉堡。我的笔记本电脑没电了,但 x.mode().tolist()[-1]x.mode().iloc[-1] 应该可以工作。
    • 当然!让我试试然后回来。
    • 完美运行!非常感谢!在旁注中,你能告诉我我使用 for() 循环的方法有什么问题吗?我觉得逻辑看起来不错,但我收到错误“int' object does not support item assignment”。
    • 在我看来,您需要在循环 mode_pressure = [] 之前定义第一个 empy 列表,然后将每个值更改 mode_pressure[j] = splitdata.mode() 附加到 mode_pressure.append(splitdata.mode())
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多