python - 如何在 Pandas 中比较前一行并使用 group by 更改另一列的值?

标签 python pandas

我有一个像这样的数据框,

>>> import pandas as pd
>>> data = {
    'code': ['123456', '123456', '123456', '123abc', '123abc', '123abc'],
    'price': [112.58, 112.58, 113.25, 120.31, 120.36, 140.12],
}... ... ...
>>> all_df = pd.DataFrame(data)
>>> all_df
     code   price
0  123456  112.58
1  123456  112.58
2  123456  113.25
3  123abc  120.31
4  123abc  120.36
5  123abc  140.12

我想创建一个名为 period 的列,并在价格不相同时增加周期。每笔交易都应根据唯一的代码进行。这是预期的输出,

     code   price  period
0  123456  112.58     1.0
1  123456  112.58     1.0
2  123456  113.25     2.0
3  123abc  112.58     1.0
4  123abc  112.58     1.0
5  123abc  113.25     2.0

我是这样做的,但是当数据太多的时候,时间太长了。

def get_period(df):
    period = df.loc[0, 'period'] = 1
    df = df.reset_index(drop=True)

    for i in range(1, len(df)):
        if df.loc[i, 'price'] != df.loc[i - 1, 'price']:
            df.loc[i, 'period'] = period + 1
            period += 1
        else:
            df.loc[i, 'period'] = period

    return df

all_df.groupby('code').apply(get_period).reset_index(drop=True)

有什么想法吗?提前致谢。

最佳答案

首先通过 Series.shiftSeries.cumsum 测试连续的 price 值,然后为每个组调用 factorize 的每个值:

df['period'] = (df.assign(new = df['price'].ne(df['price'].shift()).cumsum())
                  .groupby('code')['new']
                  .transform(lambda x: pd.factorize(x)[0]) + 1)
print (df)
     code   price  period
0  123456  112.58       1
1  123456  112.58       1
2  123456  113.25       2
3  123abc  112.58       1
4  123abc  112.58       1
5  123abc  113.25       2

关于python - 如何在 Pandas 中比较前一行并使用 group by 更改另一列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59210306/

相关文章:

python - pandas DataFrame.join 的运行时间(大 "O"顺序)是多少?

python - 如何连接数据框中的值

python - Google Cloud API 403 - 权限不足

Python unittest 仅跳过一个子类的测试

python - 处理来自 sys.exc_info() 的回溯对象时的适当注意和安全

python - 如何增加 networkx.spring_layout 的节点间距

python - from package import module VS import package.module as moduleName

python - pandas 将标题与行进行比较并删除重复的行

python - 根据来自另一列 pandas 的相同或更接近的值替换列中的值

python - 当一个数据框中只有某些日期存在于其他数据框中的其他两个日期之间时,如何连接两个数据框?