我需要将我的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
有没有人有一个简单的熊猫方式来转换它?
答案 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)
以下是使用groupby
,pd.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