2017-06-29 10 views
-2

Ich habe eine Multidatenrahmen mit id und month als Indizes in Scheiben schneidenPython - Wie mit Multi-Indizes und Bedingungen in Pandas

enter image description here

Für jeden id (Index 1), möchte ich in Scheiben schneiden können, month (Index 2) bis zum letzten Wert ungleich Null in den Spalten Betrag1 oder Betrag2.

Wunsch Ausgang
enter image description here

Ich habe versucht, alle IDs schneiden, aber ich kann nicht herausfinden, wie ich verschiedene Spannfutter für jede ids schneiden soll:

df.loc[:,:max(df[df['amount1'] != 0].index)[1]] 
+0

Können Sie bitte den Ausgang erwartete für das obige Beispiel teilen? Es wäre auch gut, einen Code-Versuch zu haben, den Sie haben könnten. –

+0

@Cedric aktualisierte Frage – obabs

+0

Sind Sie sicher, dass die Ausgabe die Sie gepostet haben? Ich glaube, dass zwei Zeilen fehlen. Bitte überprüfe meine Antwort. –

Antwort

1

Es könnte sein, eine effizientere Option. Aber mit folgendem Code können Sie erreichen, was Sie wollen:

import pandas as pd 

# We create the original dataframe 
arrays = [[102,102,102,102,102,102,102,102,103,103,103,103,103,103,103,104,104,104,104,104,104,104,104,104,104], 
["11/1/2004","12/1/2004","1/1/2005","2/1/2005","3/1/2005","4/1/2005","5/1/2005","6/1/2005","4/1/2003","5/1/2003","6/1/2003","7/1/2003","8/1/2003","9/1/2003","10/1/2003","8/1/2003","9/1/2003","10/1/2003","11/1/2003","12/1/2003","1/1/2004","2/1/2004","3/1/2004","4/1/2004","5/1/2004"]] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['id', 'month']) 
amount1 = [0,0,-9100000,0,1444.1,0,0,0,0,0,0,-5.4e7,0,0,0,0,0,0,0,-3.3e7,-4.3e7,0,0,0,0] 
amount2 = [1105.900001,0,1037.3,0,0,0,0,0,0,0,0,0,0,0,0,117.4199962,117.315,0,0,107.77771641,105.9499986,0,106.3398808,0,0] 
df = pd.DataFrame({"amount1": amount1, "amount2": amount2},index=index) 

# We slice the dataframe by ids 
df_out_list = list() 
for i,id in enumerate(df.index.levels[0]): 
    df2 = df.xs((id,)) 
    df2_nonzeros = df2[(df2['amount1'] != 0) | (df2['amount2'] != 0)] 
    df2_result = df2[:df2_nonzeros.tail(1).index[0]] 
    N = len(df2_result.index) 
    arrays = [[id]*N, df2_result.index] 
    tuples_result = list(zip(*arrays)) 
    index_result = pd.MultiIndex.from_tuples(tuples_result, names=['id', 'month']) 
    df_out_list.append(pd.DataFrame({"amount1": list(df2_result["amount1"]),"amount2": list(df2_result["amount2"])},index=index_result)) 

# We create the output dataframe appending the dataframes by id 
for i,df_el in enumerate(df_out_list): 
    if i==0: 
     df_out = df_el 
    else: 
     df_out = df_out.append(df_el) 

print df 
print df_out 

Ausgang für solche sind:

enter image description here

Verwandte Themen