使用熊猫计算滚动窗口中的不同字符串

use*_*237 5 python pandas

如何计算熊猫数据框滚动窗口中唯一字符串的数量?

a = pd.DataFrame(['a','b','a','a','b','c','d','e','e','e','e'])
a.rolling(3).apply(lambda x: len(np.unique(x)))
Run Code Online (Sandbox Code Playgroud)

输出,与原始数据帧相同:

    0
0   a
1   b
2   a
3   a
4   b
5   c
6   d
7   e
8   e
9   e
10  e
Run Code Online (Sandbox Code Playgroud)

预期的:

    0
0   1
1   2
2   2
3   2
4   2
5   3
6   3
7   3
8   2
9   1
10  1
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 6

我认为您首先需要将值转换为数字 - byfactorize或 by rank。还需要min_periods参数以避免NaN在列的开头:

a[0] = pd.factorize(a[0])[0]
print (a)
    0
0   0
1   1
2   0
3   0
4   1
5   2
6   3
7   4
8   4
9   4
10  4

b = a.rolling(3, min_periods=1).apply(lambda x: len(np.unique(x))).astype(int)
print (b)
    0
0   1
1   2
2   2
3   2
4   2
5   3
6   3
7   3
8   2
9   1
10  1
Run Code Online (Sandbox Code Playgroud)

或者:

a[0] = a[0].rank(method='dense')
      0
0   1.0
1   2.0
2   1.0
3   1.0
4   2.0
5   3.0
6   4.0
7   5.0
8   5.0
9   5.0
10  5.0

b = a.rolling(3, min_periods=1).apply(lambda x: len(np.unique(x))).astype(int)
print (b)
    0
0   1
1   2
2   2
3   2
4   2
5   3
6   3
7   3
8   2
9   1
10  1
Run Code Online (Sandbox Code Playgroud)