gpt4 book ai didi

python - Pandas 滚动申请不做任何事情

转载 作者:太空狗 更新时间:2023-10-29 17:34:40 24 4
gpt4 key购买 nike

我有一个像这样的 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)

但这给了我原来的数据帧:

         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?

Pandas 版本: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

这是怎么回事?滚动操作可以应用于pandas中的对象类型列吗?

最佳答案

这是解决此问题的一种方法。请注意,rollingnumpy 方法的包装器以及与之相关的效率,但不是。这仅仅提供了一个类似的 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 方法的自定义数据框类。它不太符合 pandas 的方式,因为它一次只在一个列上运行。

测试代码:

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

关于python - Pandas 滚动申请不做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44479384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com