2016-06-14 11 views
1

ich Pandas Datenrahmen haben (df) wie unten:Auffüllen einer Datenrahmen durch einen anderen Datenrahmen in Pandas aufzublicken

AccountName AccountName2 DateTime 
abc   guest   2016-06-10 20:46 
       guest   2016-06-10 21:32 
def       2016-06-10 23:11 
          2016-06-10 23:31 
ghi       2016-06-10 24:41 

Ich brauche einen neuen Datenrahmen (df1) abzuleiten, basierend auf dem obigen Datenrahmen. df1 sollte 2 Felder haben, ResultAccount und DateTime.

if(df["AccountName"] != ' '): 
df1["ResultAccount"] = df["AccountName"] 
elif(df["AccountName2] != ' '): 
df1["ResultAccount"] = df["AccountName2"] 
else: 
df1["ResultAccount"] = "none" 

Dies ist der Ansatz, den ich folgte aber df1 nicht wie erwartet bevölkert zu werden. Jede Hilfe wäre willkommen.

Antwort

0

Ich glaube, Sie können zuerst replace Strings mit Leerzeichen ' ' zu NaN und dann apply benutzerdefinierte Funktion f mit last_valid_index. Die Ausgabe ist Dataframe von SeriesResultAccount und df.DateTime:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'AccountName2': {0: 'guest', 1: 'guest', 2: ' ', 3: ' ', 4: ' '}, 
        'DateTime': {0: '2016-06-10 20:46', 1: '2016-06-10 21:32', 2: '2016-06-10 23:11', 3: '2016-06-10 23:31', 4: '2016-06-10 24:41'}, 
        'AccountName': {0: 'abc', 1: ' ', 2: 'def', 3: ' ', 4: 'ghi'}}) 

print (df) 
    AccountName AccountName2   DateTime 
0   abc  guest 2016-06-10 20:46 
1     guest 2016-06-10 21:32 
2   def    2016-06-10 23:11 
3       2016-06-10 23:31 
4   ghi    2016-06-10 24:41 
df[['AccountName','AccountName2']] = df[['AccountName','AccountName2']].replace(' ',np.nan) 

def f(x): 
    if x.first_valid_index() is None: 
     return 'None' 
    else: 
     return x[x.first_valid_index()] 

ResultAccount = (df[['AccountName','AccountName2']].apply(f, axis=1)) 

df1 = pd.DataFrame({'ResultAccount':ResultAccount ,'DateTime':df.DateTime}, 
        columns=['ResultAccount','DateTime']) 

print (df1) 
    ResultAccount   DateTime 
0   abc 2016-06-10 20:46 
1   guest 2016-06-10 21:32 
2   def 2016-06-10 23:11 
3   None 2016-06-10 23:31 
4   ghi 2016-06-10 24:41 
+0

Danke. Das ResultAccount wird ausgefüllt, wenn Kontoname vorhanden ist. Es funktioniert nicht für andere 2 Fälle - das heißt, wenn AccountName null ist und AccountName2 Inhalt hat, dann ist ResultAccount der Inhalt in AccountName2. Es füllt auch nicht "keine", wenn beide leer sind. – user3447653

+0

Ok, vielleicht fehlt mir etwas. Was ist die gewünschte Ausgabe der Spalte 'ResultAccount'? – jezrael

+0

Bitte überprüfen Sie bearbeiten, ich füge eine andere Lösung hinzu. – jezrael

0

Sie np.select nutzen könnten. Es ist ein Multi-bedingte Verallgemeinerung von np.where:

import numpy as np 
import pandas as pd 
df = pd.DataFrame(
    {'AccountName': ['abc', ' ', 'def', ' ', 'ghi'], 
    'AccountName2': ['guest', 'guest', ' ', ' ', ' '], 
    'DateTime': ['2016-06-10 20:46', '2016-06-10 21:32', '2016-06-10 23:11', '2016-06-10 23:31', '2016-06-10 24:41']}) 

conditions = [df['AccountName'] != ' ', df['AccountName2'] != ' '] 
choices = [df["AccountName"], df["AccountName2"]] 
df['ResultAccount'] = np.select(conditions, choices, default='none') 

ergibt

AccountName AccountName2   DateTime ResultAccount 
0   abc  guest 2016-06-10 20:46   abc 
1     guest 2016-06-10 21:32   guest 
2   def    2016-06-10 23:11   def 
3       2016-06-10 23:31   none 
4   ghi    2016-06-10 24:41   ghi 
+0

Können Sie bitte auf diese http://stackoverflow.com/questions/3694918/how-to-extract-frequency-associated-with-fft-values-in-python#comment63088544_3695448 antworten – AQU