簡體   English   中英

拼接並合並兩列以形成新的數據框(熊貓)

[英]Splice and combine two columns to form a new data frame (Pandas)

我需要將我的pandas數據框轉換為一個奇怪的列表。 我有以下示例熊貓數據框:

輸入數據框:

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

所需的數據框:

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

有沒有人有簡單的熊貓方式來轉換它?

這是我的嘗試:

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

附言:我敢肯定必須有更優雅的解決方案。

這是使用groupbypd.concat和索引的Pandas方法:

(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))

輸出:

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

如果您確實希望使用“>”符號,請使用以下命令:

(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))

輸出:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM