我有一个这样的DataFrame:
df2 = pd.DataFrame({'date': ['2015-01-01', '2015-01-02', '2015-01-03'],
'value': ['a', 'b', 'a']})
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
我试图了解如何应用自定义滚动功能。我试过这样做:
df2.rolling(2).apply(lambda x: 1)
但这给了我原来的DataFrame:
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
如果我有一个不同的DataFrame,像这样:
df3 = pd.DataFrame({'a': [1, 2, 3], 'value': [4, 5, 6]})
同样的滚动应用似乎也有效:
df3.rolling(2).apply(lambda x: 1)
a value
0 NaN NaN
1 1.0 1.0
2 1.0 1.0
为什么这不适用于第一个DataFrame呢?
熊猫版本: 0.20.2
Python版本: 2.7.10
更新
因此,我意识到df2
的列是对象类型的,而我的lambda函数的输出是一个整数。df3
的列都是整数列。我假设这就是为什么apply
不能工作的原因。
以下不工作:
df2.rolling(2).apply(lambda x: 'a')
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
此外,假设我希望在滚动的基础上连接value
列中的字符,以便lambda函数的输出是一个字符串,而不是一个整数。以下内容也不起作用:
df2.rolling(2).apply(lambda x: '.'.join(x))
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
这里发生了什么事?滚动操作可以应用于熊猫中的对象类型列吗?
发布于 2017-06-11 03:03:43
这里有一种方法可以解决这个问题。注意到rolling
是numpy
方法的包装器以及与这些方法相关的效率,但事实并非如此。这仅仅提供了一个类似的api,允许在非数字列上滚动:
代码:
import pandas as pd
class MyDataFrame(pd.DataFrame):
@property
def _constructor(self):
return MyDataFrame
def rolling_object(self, window, column, default):
return pd.concat(
[self[column].shift(i) for i in range(window)],
axis=1).fillna(default).T
这将创建一个具有rolling_object
方法的自定义dataframe类。它不适合熊猫的方式,因为它一次只在一个列上操作。
测试代码:
df2 = MyDataFrame({'date': ['2015-01-01', '2015-01-02', '2015-01-03'],
'value': ['a', 'b', 'c'],
'num': [1, 2, 3]
})
print(df2.rolling_object(2, 'value', '').apply(lambda x: '.'.join(x)))
结果:
0 a.
1 b.a
2 c.b
dtype: object
https://stackoverflow.com/questions/44479384
复制相似问题