2017-06-26 10 views
3

タプルの列の1つにタプルのリストを含むデータフレームがあります。リストタプルを対応する列に分割する必要があります。私のデータフレームDFは、下記の通りのようになります -データフレームの列のタプルのリストをデータフレームの列に分割します。

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

予想される出力は次のようになります。

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

答えて

1

DataFrame constを使用できますnumpy.repeatnumpy.concatenateとructor:

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 

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

これは動作するはずです:

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"]] 

出力:

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

あなたが連鎖操作で行うことができます。

(
    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 
関連する問題