我想创建一个数据帧,其中包含转置后的df1中“ atoms”列的值,以便生成的数据帧看起来像df2。
df1:
name atoms
0 CH4 C
1 CH4 H
2 CH4 H
3 CH4 H
4 CH4 H
5 NH3 N
6 NH3 H
7 NH3 H
8 NH3 H
df2:
name a0 a1 a2 a3 a4
0 CH4 C H H H H
1 CH4 C H H H H
2 CH4 C H H H H
3 CH4 C H H H H
4 CH4 C H H H H
5 NH3 N H H H NaN
6 NH3 N H H H NaN
7 NH3 N H H H NaN
8 NH3 N H H H NaN
有没有办法使用Pandas实现这一目标?
我为此使用了groupby,如下所示:
df2 = pd.DataFrame(columns=['name','a0','a1','a2','a3','a4'], index=np.arange(9))
c = df1.groupby('name')
df2['name'] = df1['name']
for mol in df1.name.unique():
df2.iloc[c.indices[mol],np.arange(1,len(c.indices[mol]) +1)] = c.get_group(mol)['atoms'].values
但是我觉得应该有一种更简单,更快捷的方法来做到这一点。
最佳答案
这主要是一个crosstab
,但还有几个附加步骤。
u = df.assign(key=df.groupby('name').cumcount()).set_index('name')
i = pd.crosstab(u.index, u['key'], u['atoms'], aggfunc='first')
# Cleanup and formatting
i.reindex(u.index).add_prefix('a').rename_axis(None, axis=1).reset_index()
name a0 a1 a2 a3 a4
0 CH4 C H H H H
1 CH4 C H H H H
2 CH4 C H H H H
3 CH4 C H H H H
4 CH4 C H H H H
5 NH3 N H H H NaN
6 NH3 N H H H NaN
7 NH3 N H H H NaN
8 NH3 N H H H NaN