【问题标题】:Transposing values in a column of a Pandas data frame转置 Pandas 数据框列中的值
【发布时间】:2019-07-29 12:48:59
【问题描述】:

我想创建一个包含 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

但我觉得应该有一种更简单、更快捷的方法来做到这一点。

【问题讨论】:

  • @Akaisteph7 这个问题足够具体,足以成为 Stack Overflow 上的话题。 Code Review 更喜欢有更多上下文的问题。请看A Guide to Code Review for SO users

标签: python pandas


【解决方案1】:

这主要是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

【讨论】:

  • 谢谢。你的代码比我的时间少 40%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2016-12-13
  • 1970-01-01
  • 2017-03-08
  • 2023-01-14
  • 2020-07-18
相关资源
最近更新 更多