2017-09-05 1 views
6

Ich habe einen Datenrahmen:Python Zeilen in Datenrahmen kombinieren und aufsummieren Werte

Type: Volume: 
Q  10 
Q  20 
T  10 
Q  10 
T  20 
T  20 
Q  10 

und ich möchte Typ T einer Zeile kombinieren und Volumen summieren sich nur dann, wenn zwei (oder mehr) Ts aufeinanderfolgende

dh:

Q 10 
Q 20 
T 10 
Q 10 
T 20+20=40 
Q 10 

ist es eine Möglichkeit, dies zu erreichen? würde DataFrame.groupby arbeiten?

+0

Das sieht aus wie es beginnen könnte Ihre Frage https://stackoverflow.com/a/45679091/4365003 – RagingRoosevelt

+0

Ich denke, das ist irgendwie anders zu adressieren ... Ich möchte stattdessen kombinieren Reihen Zähle sie – bing

+0

~~ Würdest du nicht einfach eine andere Aggregatfunktion verwenden? ~~ – RagingRoosevelt

Antwort

1

Ich denke, das wird helfen. Dieser Code kann mit einer beliebigen Anzahl aufeinanderfolgender Ts umgehen, und Sie können sogar das zu kombinierende Zeichen ändern. Ich habe Kommentare im Code hinzugefügt, um zu erklären, was es tut.

https://pastebin.com/FakbnaCj

import pandas as pd 

def combine(df): 
    combined = [] # Init empty list 
    length = len(df.iloc[:,0]) # Get the number of rows in DataFrame 
    i = 0 
    while i < length: 
     num_elements = num_elements_equal(df, i, 0, 'T') # Get the number of consecutive 'T's 
     if num_elements <= 1: # If there are 1 or less T's, append only that element to combined, with the same type 
      combined.append([df.iloc[i,0],df.iloc[i,1]]) 
     else: # Otherwise, append the sum of all the elements to combined, with 'T' type 
      combined.append(['T', sum_elements(df, i, i+num_elements, 1)]) 
     i += max(num_elements, 1) # Increment i by the number of elements combined, with a min increment of 1 
    return pd.DataFrame(combined, columns=df.columns) # Return as DataFrame 

def num_elements_equal(df, start, column, value): # Counts the number of consecutive elements 
    i = start 
    num = 0 
    while i < len(df.iloc[:,column]): 
     if df.iloc[i,column] == value: 
      num += 1 
      i += 1 
     else: 
      return num 
    return num 

def sum_elements(df, start, end, column): # Sums the elements from start to end 
    return sum(df.iloc[start:end, column]) 

frame = pd.DataFrame({"Type": ["Q", "Q", "T", "Q", "T", "T", "Q"], 
       "Volume": [10, 20, 10, 10, 20, 20, 10]}) 
print(combine(frame)) 
+0

Vielen Dank für Ihre Antwort. Darf ich fragen, wie ich diesen Code ändern kann, wenn ich einen Datenrahmen mit mehr als 2 Spalten habe, und ich möchte nur den Wert einer Spalte addieren und den Rest unverändert lassen? dh anstelle von 'Typ' und 'Volumen' habe ich 'Typ', 'Zeit', 'Volumen' und ect, und ich möchte nur den Wert für 'Volumen' – bing

+0

addieren Wenn Sie das Element an die kombinierte Liste anfügen ('a') geben Sie einfach' df.iloc [i, col] 'ein, wobei col der Spaltenindex der Spalte 'Time' ist. 'combined.append ([df.iloc [i, 0], df.iloc [i, 1]])' wird 'combined.append ([df.iloc [i, 0], df.iloc [i, 1] , df.iloc [i, 2]]) ', und' combined.append (['T', sum_elements (df, i, i + num_elements, 1)]) 'wird' combined.append (['T', df.iloc [i, 1], sum_elements (df, i, i num_elements + 2)]) ' – coolioasjulio

+0

https://stackoverflow.com/questions/46099924/how-to-combine-consecutive-data-in-a -Dataframe-und-Add-Up-Wert – bing

1

Wenn Sie nur die Teilsummen benötigen, ist hier ein kleiner Trick zu tun, dass:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({"Type": ["Q", "Q", "T", "Q", "T", "T", "Q"], 
        "Volume": [10, 20, 10, 10, 20, 20, 10]}) 
s = np.diff(np.r_[0, df.Type == "T"]) 
s[s < 0] = 0 
res = df.groupby(("Type", np.cumsum(s) - 1)).sum().loc["T"] 
print(res) 

Ausgang:

Volume 
0  10 
1  40 
+0

https://stackoverflow.com/questions/ 46099924/how-to-combine-consecutive-Daten-in-einem Datenrahmen-und-add-up-Wert – bing

+0

@bing Wird die gleiche Frage wiederholt? – jdehesa

+0

Nicht genau das gleiche, der neue Datenrahmen hat mehr als zwei Spalten – bing

Verwandte Themen