【问题标题】:Reshaping Pandas DF with non-numeric value only from long to wide仅用非数字值从长到宽重塑 Pandas DF
【发布时间】:2021-05-23 21:38:20
【问题描述】:

我正在尝试将一个相对简单的 DF(仅具有非数字值)从长变宽,但似乎无法使代码正常工作!

我有一个打击格式的表格(df1):

var_1 var_2
A1 Jan
B1 Jan
C3 Jan
A2 Feb
B2 Feb
C3 Mar

我正在尝试将 (df2) 输出为以下格式:

Jan Feb Mart
A1 A2 C3
B1 B2
C3

我检查了谷歌和其他几个链接,包括下面的线程:-)

Pivoting a Pandas Dataframe containing strings - 'No numeric types to aggregate' error

我最接近解决方案的是代码

df2 = df1.pivot_table(values='va_1', columns='var_2', aggfunc=lambda x: ', '.join(x))

但是,我得到的输出不是我想要的(如下):

Jan Feb Mart
A1, B1, C3 A2, B2 C3

感谢所有可以让我从 df1 到 df2 的帮助!

谢谢! :-)

纳德

【问题讨论】:

  • 省略aggfunc 参数,它将列表组合成逗号分隔的字符串
  • 感谢您的评论 - 但是,如果没有 aggfunc,我会收到以下错误:raise DataError("No numeric types to aggregate") pandas.core.base.DataError: No numeric types to aggregate

标签: python pandas dataframe pivot-table


【解决方案1】:

尝试使用groupby cumcount 为每个组创建索引,然后使用pivot 进行透视

import pandas as pd

df = pd.DataFrame({
    'var_1': ['A1', 'B1', 'C3', 'A2', 'B2', 'C3'],
    'var_2': ['Jan', 'Jan', 'Jan', 'Feb', 'Feb', 'Mar']
})

# New row numbers based on relative group row numbers
df['g'] = df.groupby('var_2').cumcount()
df = (
    df.pivot(index='g', columns='var_2')
        .droplevel(0, axis=1)  # Clean Up levels
        .rename_axis(None, axis=1)  # Cleanup Axis Names
        .rename_axis(None)
)

print(df)

df:

   Feb Jan  Mar
0   A2  A1   C3
1   B2  B1  NaN
2  NaN  C3  NaN

【讨论】:

  • 非常感谢!这个 sn-p 让我得到我想要的输出:-) Nad
猜你喜欢
  • 2020-03-21
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多