拼接并组合两列以形成新的数据框架(Pandas)

时间:2017-07-25 21:55:23

标签: python python-3.x pandas

我需要将我的pandas数据帧转换为一个奇怪的小列表。我有以下示例pandas dataframe:

输入数据框:

.catch((err) => {
    let emailDup = 'user already exists'
    let userDup = 'username already exists'
        this.setState({
            errMessage: err.response.body.includes(emailDup) ? errEmailDup : (err.response.body.includes(userDup) ? errUserDup : errDefault),
            error: true,
            loading: false
        })
    }

所需的数据帧:

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

有没有人有一个简单的熊猫方式来转换它?

2 个答案:

答案 0 :(得分:2)

这是我的尝试:

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我确定必须有更优雅的解决方案。

答案 1 :(得分:2)

以下是使用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