说我有一个包含字符串的数据框,例如:
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
的这种特定情况)?
答案 0 :(得分:2)
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)