如何找到 python 中每 n (50) 行的模式?
How to find mode of every n (50) rows in python?
我有一个包含 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 returns 最新(最后)模式值作为每组 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
}
我认为需要 groupby
by numpy arange 以获得更通用的解决方案,例如与 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
我认为另一个解决方案(rolling
)可能是这样的:
from scipy.stats import mode
df_mode = df['Col5'].rolling(window=50, min_periods=1).apply(lambda x: mode(x)[0])[::50]
我有一个包含 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 returns 最新(最后)模式值作为每组 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
}
我认为需要 groupby
by numpy arange 以获得更通用的解决方案,例如与 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
我认为另一个解决方案(rolling
)可能是这样的:
from scipy.stats import mode
df_mode = df['Col5'].rolling(window=50, min_periods=1).apply(lambda x: mode(x)[0])[::50]