【问题标题】:How to transpose a subset of values in a dataframe in pandas?如何在熊猫的数据框中转置值的子集?
【发布时间】:2018-11-01 16:12:49
【问题描述】:

我不确定我的措辞是否正确,但我会举例说明。

我尝试过“groupby”和“pivot”,但我无法解决。

所以,这是我的数据框:

         col1       col2      col3
0         A          a         3
1         A          b         5
2         A          c         10
3         B          d         12
4         B          e         6
5         C          f         9

期望的输出是:

        col2_1     col2_2     col2_3     col3_1    col3_2    col3_3
A         a          b          c          3          5        10
B         d          e         NaN         12         6        NaN
C         f         NaN        NaN         9         NaN       NaN

到目前为止,我已经尝试使用for's:

frecs = pd.crosstab(index = frame['col1'], columns = 'frecuencia')
output_df = pd.DataFrame(columns = 'col1')
for k in frame.index.values:
    for i in frame.keys():
        for j in range(1,frecs.frecuencia.values[list(np.unique(frame['col1'].values)).index(frame.loc[k,'col1'])]+1):
           output_df.loc[k,"".join([i,str(j)])] = frame.loc[str(int(list(np.unique(frame['col1'].values)).index(frame.loc[k,'col1']))+j-1),i]

接近它,但在为每个条目分配正确的元素时不足。我也一直在寻找在

中使用 groupby
frame.groupby(['col1']).apply(frame[list).apply(pd.Series)

但也没有找到运气。

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow!到目前为止,您到底尝试了什么。请分享您使用的代码的sn-ps
  • 谢谢@ScipioneSarlo。好吧,到目前为止,我所拥有的最好的是我认为效率很低,但至少是这样。我会更新问题。
  • 您能用文字描述一下输出的内容以及获取输出的方法吗?
  • @HarvIpan 嘿!好吧,我想为元素的每个“类别”分组“col1”。然后,创建n个子列,其元素是该列类别的对应值。

标签: python-3.x pandas pandas-groupby


【解决方案1】:

使用set_indexgroupbycumcount

df_out = df.set_index(['col1',df.groupby('col1').cumcount() + 1]).unstack()
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)
df_out

输出:

     col2_1 col2_2 col2_3  col3_1  col3_2  col3_3
col1                                             
A         a      b      c     3.0     5.0    10.0
B         d      e    NaN    12.0     6.0     NaN
C         f    NaN    NaN     9.0     NaN     NaN

【讨论】:

    【解决方案2】:

    超级接近!你有代码:

    a = df.groupby('col1')['col2'].apply(list).apply(pd.Series)
    
    b = df.groupby('col1')['col3'].apply(list).apply(pd.Series)
    
    pd.concat([a,b], axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 2023-03-13
      • 2016-03-28
      • 1970-01-01
      • 2022-12-16
      • 2018-01-02
      • 2015-02-02
      • 2022-01-04
      相关资源
      最近更新 更多