首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >熊猫翻滚申请什么都不做

熊猫翻滚申请什么都不做
EN

Stack Overflow用户
提问于 2017-06-11 00:43:10
回答 1查看 1.9K关注 0票数 13

我有一个这样的DataFrame:

代码语言:javascript
复制
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

我试图了解如何应用自定义滚动功能。我试过这样做:

代码语言:javascript
复制
df2.rolling(2).apply(lambda x: 1)

但这给了我原来的DataFrame:

代码语言:javascript
复制
         date value
0  2015-01-01     a
1  2015-01-02     b
2  2015-01-03     a

如果我有一个不同的DataFrame,像这样:

代码语言:javascript
复制
df3 = pd.DataFrame({'a': [1, 2, 3], 'value': [4, 5, 6]})

同样的滚动应用似乎也有效:

代码语言:javascript
复制
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不能工作的原因。

以下不工作

代码语言:javascript
复制
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函数的输出是一个字符串,而不是一个整数。以下内容也不起作用:

代码语言:javascript
复制
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

这里发生了什么事?滚动操作可以应用于熊猫中的对象类型列吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-11 03:03:43

这里有一种方法可以解决这个问题。注意到rollingnumpy方法的包装器以及与这些方法相关的效率,但事实并非如此。这仅仅提供了一个类似的api,允许在非数字列上滚动:

代码:

代码语言:javascript
复制
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类。它不适合熊猫的方式,因为它一次只在一个列上操作。

测试代码:

代码语言:javascript
复制
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)))

结果:

代码语言:javascript
复制
0     a.
1    b.a
2    c.b
dtype: object
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44479384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档