2017-07-25 5 views
1

Ich muss meine Pandas Dataframe in eine kleine ungerade Liste konvertieren. Ich habe folgendes Beispiel Pandas Datenrahmen:Splice und kombinieren zwei Spalten zu einem neuen Datenrahmen (Pandas)

Eingangsdatenrahmen:

mydf= pd.DataFrame.from_dict({'ARS':['xx2','xx3','xx1'], 'xyz':['yy1','xx2','xx3'], 'ppp':['xx3','yy2','xx2']}, orient='columns') 
mydf= mydf.stack().reset_index() 
mydf.columns= ['list1','list2','list3'] 
newdf= mydf[['list2','list3']] 
newdf 

    list2 list3 
0 ARS xx2 
1 ppp xx3 
2 xyz yy1 
3 ARS xx3 
4 ppp yy2 
5 xyz xx2 
6 ARS xx1 
7 ppp xx2 
8 xyz xx3 

Gewünschte Datenrahmen:

>ARS 
xx2 
xx3 
xx1 
>ppp 
xx3 
yy2 
xx2 
>xyz 
yy1 
xx2 
xx3 

Hat jemand eine einfache Pandas Art und Weise müssen diese zu konvertieren?

Antwort

2

Hier ist ein Pandas Weg groupby verwenden, pd.concat mit Indexierung:

(newdf.groupby('list2',as_index=False) 
    .apply(lambda x: pd.concat([pd.Series(x.iloc[0]['list2']), 
           pd.Series(x.loc[:,'list3'])])) 
    .reset_index(drop=True)) 

Ausgang:

0  ARS 
1  xx2 
2  xx3 
3  xx1 
4  ppp 
5  xx3 
6  yy2 
7  xx2 
8  xyz 
9  yy1 
10 xx2 
11 xx3 
dtype: object 

Wenn Sie wirklich wollte, dass '>' Zeichen der Folge verwenden:

(newdf.groupby('list2',as_index=False) 
    .apply(lambda x: pd.concat([pd.Series('>'+x.iloc[0]['list2']), 
           pd.Series(x.loc[:,'list3'])])) 
    .reset_index(drop=True)) 

Ausgabe:

0  >ARS 
1  xx2 
2  xx3 
3  xx1 
4  >ppp 
5  xx3 
6  yy2 
7  xx2 
8  >xyz 
9  yy1 
10  xx2 
11  xx3 
dtype: object 
2

Hier ist mein Versuch:

In [173]: v = np.concatenate(
    ...:   pd.DataFrame(
    ...:    newdf.groupby('list2')['list3'].apply(lambda x: [x.name] + x.values.tolist())) 
    ...:   .values 
    ...:   .reshape(-1,) 
    ...:) 

In [174]: pd.DataFrame({'col':v}) 
Out[174]: 
    col 
0 ARS 
1 xx2 
2 xx3 
3 xx1 
4 ppp 
5 xx3 
6 yy2 
7 xx2 
8 xyz 
9 yy1 
10 xx2 
11 xx3 

PS Ich bin sicher, es muss viel elegantere Lösung.

Verwandte Themen