2017-06-26 5 views
3

Ich habe ein Datenframe, das eine Liste von Tupeln in einer seiner Spalten enthält. Ich muss die Listentupel in entsprechende Spalten aufteilen. Mein Datenrahmen df sieht aus wie wie unten angegeben: -Teilen einer Liste von Tupeln in einer Spalte von Datenrahmen zu Spalten eines Datenrahmens

  A          B 
[('Apple',50),('Orange',30),('banana',10)]  Winter 
[('Orange',69),('WaterMelon',50)]     Summer 

Die erwartete ausgegeben werden soll:

Fruit   rate    B 
    Apple   50    winter 
    Orange   30    winter 
    banana   10    winter 
    Orange   69    summer 
    WaterMelon  50    summer 

Antwort

1

Sie können DataFrame const verwenden ructor mit numpy.repeat und numpy.concatenate:

df1 = pd.DataFrame(np.concatenate(df.A), columns=['Fruit','rate']).reset_index(drop=True) 
df1['B'] = np.repeat(df.B.values, df['A'].str.len()) 
print (df1) 
     Fruit rate  B 
0  Apple 50 Winter 
1  Orange 30 Winter 
2  banana 10 Winter 
3  Orange 69 Summer 
4 WaterMelon 50 Summer 

Eine andere Lösung mit chain.from_iterable:

from itertools import chain 

df1 = pd.DataFrame(list(chain.from_iterable(df.A)), columns=['Fruit','rate']) 
     .reset_index(drop=True) 
df1['B'] = np.repeat(df.B.values, df['A'].str.len()) 
print (df1) 
     Fruit rate  B 
0  Apple 50 Winter 
1  Orange 30 Winter 
2  banana 10 Winter 
3  Orange 69 Summer 
4 WaterMelon 50 Summer 
1

Dies sollte funktionieren:

fruits = [] 
rates = [] 
seasons = [] 

def create_lists(row): 
    tuples = row['A'] 
    season = row['B'] 
    for t in tuples: 
     fruits.append(t[0]) 
     rates.append(t[1]) 
     seasons.append(season) 

df.apply(create_lists, axis=1) 

new_df = pd.DataFrame({"Fruit" :fruits, "Rate": rates, "B": seasons})[["Fruit", "Rate", "B"]] 

Ausgang:

 Fruit Rate  B 
0  Apple 50 winter 
1  Orange 30 winter 
2  banana 10 winter 
3  Orange 69 summer 
4 WaterMelon 50 summer 
0

Sie können dies in einer verketteten Betrieb:

(
    df.apply(lambda x: [[k,v,x.B] for k,v in x.A],axis=1) 
     .apply(pd.Series) 
     .stack() 
     .apply(pd.Series) 
     .reset_index(drop=True) 
     .rename(columns={0:'Fruit',1:'rate',2:'B'}) 
) 
Out[1036]: 
     Fruit rate  B 
0  Apple 50 Winter 
1  Orange 30 Winter 
2  banana 10 Winter 
3  Orange 69 Summer 
4 WaterMelon 50 Summer 
Verwandte Themen