Mam dataframe, który zawiera listę Ktorek w jednej z jego kolumn. Muszę podzielić listę Ktorek do odpowiednich kolumn. Mój dataframe DF wygląda jak podana poniżej: -

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

Oczekiwany wynik powinien być:

    Fruit         rate             B
  Apple           50              winter   
  Orange          30              winter   
  banana          10              winter   
  Orange          69              summer   
  WaterMelon      50              summer 
3
Nayana Madhu 26 czerwiec 2017, 14:23

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć DataFrame konstruktor numpy.repeat i 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

Inne rozwiązanie z 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
jezrael 26 czerwiec 2017, 11:51

To powinno działać:

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

Wynik:

        Fruit  Rate       B
0       Apple    50  winter
1      Orange    30  winter
2      banana    10  winter
3      Orange    69  summer
4  WaterMelon    50  summer
1
AndreyF 26 czerwiec 2017, 11:36

Możesz to zrobić w przykuconym operacji:

(
    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
0
Allen 26 czerwiec 2017, 11:48