【发布时间】:2020-02-21 00:05:41
【问题描述】:
我手动将 pandas df 中的特定值传递给函数。这很好,但我希望让这个过程更有效率。具体来说,我首先对Item 中的所有连续值进行子集化。然后我将Val 中的相应值传递给func。这会产生我需要的值。这对于较小的 df 是可以的,但对于较大的数据集变得低效。
我只是希望使这个过程更有效地将值应用于原始 df。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Time' : ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15'],
'Val' : [35,38,31,30,35,31,32,34,36,38,39,30,25,26,27],
'Item' : ['X','X','X','X','X','Y','Y','Y','Y','Y','Y','X','X','X','X'],
})
df1 = df.groupby([df['Item'].ne(df['Item'].shift()).cumsum(), 'Item']).size()
X1 = df[0:5]
Y1 = df[5:11]
X2 = df[11:15]
V1 = X1['Val1'].reset_index(drop = True)
V2 = Y1['Val1'].reset_index(drop = True)
V3 = X2['Val1'].reset_index(drop = True)
def func(U, m = 2, r = 0.2):
def _maxdist(x_i, x_j):
return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
def _phi(m):
x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
return (N - m + 1.0)**(-1) * sum(np.log(C))
N = len(U)
return abs(_phi(m + 1) - _phi(m))
print(func(V1))
print(func(V2))
print(func(V3))
出来:
0.287682072452
0.223143551314
0.405465108108
如果我只是尝试使用groupby 应用该函数,它会返回KeyError: 0。除非我重置索引,否则该功能不起作用。
df1 = df.groupby(['Item']).apply(func)
密钥错误:0
预期输出:
Time Val1 Item func
0 1 35 X 0.287
1 2 38 X 0.287
2 3 31 X 0.287
3 4 30 X 0.287
4 5 35 X 0.287
5 6 31 Y 0.223
6 7 32 Y 0.223
7 8 34 Y 0.223
8 9 36 Y 0.223
9 10 38 Y 0.223
10 11 39 Y 0.223
11 12 30 X 0.405
12 13 25 X 0.405
13 14 26 X 0.405
14 15 27 X 0.405
【问题讨论】: