滚动总和

时间:2019-06-11 10:29:50

标签: python pandas

说我有一个包含字符串的数据框,例如:

df = pd.DataFrame({'col1':list('some_string')})

    col1
0     s
1     o    
2     m
3     e
4     _
5     s
...

我正在寻找一种在col1上应用滚动窗口并以特定窗口大小连接字符串的方法。假设window=3,我想获得(没有最小观察数):

     col1
0     s
1     so
2     som
3     ome
4     me_
5     e_s
6     _st
7     str
8     tri
9     rin
10    ing

我用rolling尝试了明显的解决方案,这些解决方案无法处理对象类型:

df.col1.rolling(3, min_periods=0).sum()
df.col1.rolling(3, min_periods=0).apply(''.join)

两次加薪:

  

无法处理此类型->对象

是否有一种通用的方法(不使用shift来匹配w=3的这种特定情况)?

3 个答案:

答案 0 :(得分:2)

滚动works only with numbers

def _prep_values(self, values=None, kill_inf=True):
        if values is None:
            values = getattr(self._selected_obj, 'values', self._selected_obj)
        # GH #12373 : rolling functions error on float32 data
        # make sure the data is coerced to float64
        if is_float_dtype(values.dtype):
            values = ensure_float64(values)
        elif is_integer_dtype(values.dtype):
            values = ensure_float64(values)
        elif needs_i8_conversion(values.dtype):
            raise NotImplementedError...
    ...
    ...

因此,您应该手动构造它。这是具有简单列表理解的可能变体之一(也许存在更多的熊猫式方式):

df = pd.DataFrame({'col1':list('some_string')})
pd.Series([
    ''.join(df.col1.values[max(i-2, 0): i+1])
    for i in range(len(df.col1.values))
])
0       s
1      so
2     som
3     ome
4     me_
5     e_s
6     _st
7     str
8     tri
9     rin
10    ing
dtype: object

答案 1 :(得分:1)

使用pd.Series.cumsum似乎很有效(尽管效率低下):

df['col1'].cumsum().str[-3:]

输出:

0       s
1      so
2     som
3     ome
4     me_
5     e_s
6     _st
7     str
8     tri
9     rin
10    ing
Name: col1, dtype: object

答案 2 :(得分:1)

如何改变系列?

df.col1.shift(2).fillna('') + df.col1.shift().fillna('') + df.col1

概括为任意数字:

pd.concat([df.col1.shift(i).fillna('') for i in range(3)], axis=1).sum(axis=1)