【问题标题】:Python Reshape Column Into Multiple Columns - Alternating RowsPython将列重塑为多列 - 交替行
【发布时间】:2021-12-18 09:31:38
【问题描述】:

任何人都可以提出一种将列(在 python pandas 数据框中)重塑为多列的有效方法,并交替列分配。我可以用循环来做到这一点,但想知道是否有更优雅的方式。例如,请考虑以下示例:

已添加: 有没有人可以将单个列中的每 n 个值重新整形为 n 个单独的列,例如从具有 n 个变量的单列重塑为 n 列?

  Col
1 x1 
2 y1 
3 z1 
4 x2 
5 y2 
6 z2
7 x3 
8 y3 
9 z3 
..

  x  y  z 
1 x1 y1 z1 
2 x2 y2 z2 
3 x3 y3 z3  
...

【问题讨论】:

  • 您的实际值是否与您提供的样本数据相似?即,您正在尝试将字符串值的开始和结束分别用作索引和列名?还是您只关心将每三个值移动到一行?
  • 嘿。主要关注将列中的每 n 个值移动到 n 行!
  • 请注意下面两种答案的区别。这个细节最好包含在您的问题描述或示例数据中,以消除歧义。

标签: python pandas


【解决方案1】:

假设您对给定形状具有正确数量的值,并且您只关心按形状对值进行排序而不考虑值本身,您可以只重塑基础值

s
    Col
1   x1
2   y1
3   z1
4   x2
5   y2
6   z2
7   x3
8   y3
9   z3

pd.DataFrame(s.to_numpy().reshape(3, 3))

    0   1   2
0   x1  y1  z1
1   x2  y2  z2
2   x3  y3  z3

【讨论】:

    【解决方案2】:

    你可以使用:

    df_final=(pd.DataFrame(df.groupby(df.Col.str[-1])['Col'].apply(list)
                       .values.tolist(),columns=['x','y','z']))
    

        x   y   z
    0  x1  y1  z1
    1  x2  y2  z2
    2  x3  y3  z3
    

    【讨论】:

    • 可能值得注意:这假设字符串值实际上是分组键,这从原始问题中不清楚
    【解决方案3】:

    可以使用辅助变量作为行列索引,然后应用df.pivot

    df1['aux'] = df1.Col.str[:-1]
    df1['aux_idx'] = df1.Col.str[-1:]
    print(df1.pivot(index= 'aux_idx', columns='aux', values='Col'))
    

    输出:

    aux       x   y   z
    aux_idx            
    1        x1  y1  z1
    2        x2  y2  z2
    3        x3  y3  z3
    

    如果只计算元素个数,同样的结果,使用df.index模块n作为键

    df1['aux_idx'] = (df1.index-1)// 3
    df1['aux'] = df1.Col.str[:-1]
    print(df1.pivot(index= 'aux_idx', columns='aux', values='Col'))
    

    输出:

    aux       x   y   z
    aux_idx            
    0        x1  y1  z1
    1        x2  y2  z2
    2        x3  y3  z3
    

    【讨论】:

    • 可能值得注意:这假设字符串值实际上是分组键,这从原始问题中不清楚
    • 很公平,就像您正确声明的那样,只有当数据按大小为 3 的“桶”排序时,您的解决方案才有效,这毫无价值。猜猜问题的准确性不可避免地与答案的质量有关:)
    • 同意,需要 OP 澄清。我已经相应地编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2019-02-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多