AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78310014
Accepted
Fresto
Fresto
Asked: 2024-04-11 19:28:11 +0800 CST2024-04-11 19:28:11 +0800 CST 2024-04-11 19:28:11 +0800 CST

Algumas manipulações com groupby Pandas

  • 772

Eu tenho esse Dataframe

import pandas as pd
import math
from pandas import Timestamp

Date = [Timestamp('2024-03-16 23:59:42'), Timestamp('2024-03-16 23:59:42'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:44'), Timestamp('2024-03-16 23:59:47'), Timestamp('2024-03-16 23:59:48'), Timestamp('2024-03-16 23:59:48'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49'), Timestamp('2024-03-16 23:59:49')]
Price = [0.6729, 0.6728, 0.6728, 0.6728, 0.6728, 0.673, 0.6728, 0.6729, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6728, 0.6729, 0.6728]
Side = [-1, -1, -1, 1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1]
Amount = [1579.2963000000002, 7.400799999999999, 6.728, 177.61919999999998, 797.2679999999999, 33650.0, 131.196, 48.448800000000006, 0.6728, 0.6728, 0.6728, 6.728, 0.6728, 1.3456, 0.6728, 0.6728, 0.6728, 0.6728, 0.6729, 0.6728]
buy = [math.nan, math.nan, math.nan, 177.61919999999998, math.nan, 33650.0, math.nan, 48.448800000000006, math.nan, math.nan, math.nan, math.nan, math.nan, math.nan, math.nan, math.nan, math.nan, math.nan, 49.121700000000004, math.nan]

df = pd.DataFrame({
    'Date':Date,
    'Price':Price,
    'Side':Side,
    'Amount':Amount,
    'buy':buy
})

print(df)

Eu tenho buycoluna usando

df['buy'] = df[df['Side'] == 1].groupby([df['Date'].dt.floor('H'), 'Price'])['Amount'].cumsum()

Mas quero pegar 0 na buycoluna ao invés de nan valores, caso esse preço ainda não tenha sido atendido no grupo ou o valor anterior da soma acumulada

Necessidade da coluna de resultados buy- [0,0,0,177.6192,177.6192,33650, 177.6192,48.4488, 177.6192,.....]

Como posso implementar isso?

python
  • 1 1 respostas
  • 37 Views

1 respostas

  • Voted
  1. Best Answer
    mozway
    2024-04-11T19:30:21+08:002024-04-11T19:30:21+08:00

    Você poderia reindex, ffille fillna:

    df['buy'] = (df[df['Side'] == 1].groupby([df['Date'].dt.floor('H'), 'Price'])['Amount'].cumsum()
                 .reindex(df.index).ffill().fillna(0)
                )
    

    Ou em duas etapas:

    df['buy'] = df[df['Side'] == 1].groupby([df['Date'].dt.floor('H'), 'Price'])['Amount'].cumsum()
    df['buy'] = df['buy'].ffill().fillna(0)
    

    Saída:

                      Date   Price  Side      Amount         buy
    0  2024-03-16 23:59:42  0.6729    -1   1579.2963      0.0000
    1  2024-03-16 23:59:42  0.6728    -1      7.4008      0.0000
    2  2024-03-16 23:59:44  0.6728    -1      6.7280      0.0000
    3  2024-03-16 23:59:44  0.6728     1    177.6192    177.6192
    4  2024-03-16 23:59:44  0.6728    -1    797.2680    177.6192
    5  2024-03-16 23:59:47  0.6730     1  33650.0000  33650.0000
    6  2024-03-16 23:59:48  0.6728    -1    131.1960  33650.0000
    7  2024-03-16 23:59:48  0.6729     1     48.4488     48.4488
    8  2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    9  2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    10 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    11 2024-03-16 23:59:49  0.6728    -1      6.7280     48.4488
    12 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    13 2024-03-16 23:59:49  0.6728    -1      1.3456     48.4488
    14 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    15 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    16 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    17 2024-03-16 23:59:49  0.6728    -1      0.6728     48.4488
    18 2024-03-16 23:59:49  0.6729     1      0.6729     49.1217
    19 2024-03-16 23:59:49  0.6728    -1      0.6728     49.1217
    

    Alternativamente, se você quiser preencher com o primeiro não-NA válido, você pode usar:

    df['buy'] = df[df['Side'] == 1].groupby([df['Date'].dt.floor('H'), 'Price'])['Amount'].cumsum()
    m = df['buy'].notna()
    df['buy'] = df['buy'].fillna(df.loc[df['buy'].first_valid_index(), 'buy']).where(m.cummax(), 0)
    

    Saída:

                      Date   Price  Side      Amount         buy
    0  2024-03-16 23:59:42  0.6729    -1   1579.2963      0.0000
    1  2024-03-16 23:59:42  0.6728    -1      7.4008      0.0000
    2  2024-03-16 23:59:44  0.6728    -1      6.7280      0.0000
    3  2024-03-16 23:59:44  0.6728     1    177.6192    177.6192
    4  2024-03-16 23:59:44  0.6728    -1    797.2680    177.6192
    5  2024-03-16 23:59:47  0.6730     1  33650.0000  33650.0000
    6  2024-03-16 23:59:48  0.6728    -1    131.1960    177.6192
    7  2024-03-16 23:59:48  0.6729     1     48.4488     48.4488
    8  2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    9  2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    10 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    11 2024-03-16 23:59:49  0.6728    -1      6.7280    177.6192
    12 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    13 2024-03-16 23:59:49  0.6728    -1      1.3456    177.6192
    14 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    15 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    16 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    17 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    18 2024-03-16 23:59:49  0.6729     1      0.6729     49.1217
    19 2024-03-16 23:59:49  0.6728    -1      0.6728    177.6192
    
    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve