【问题标题】:Pivot / Groupby dataframe with duplicates in index column with non numeric dataPivot / Groupby 数据框在索引列中具有非数字数据的重复项
【发布时间】:2019-11-04 07:04:35
【问题描述】:

假设我有以下示例数据框:

df1 = pd.DataFrame({'col1': ['A', 'A', 'B', 'A'], 'col2': ['CA', 'DA', 'CA', 'CA'], 'col3': [1, 1, 1, 2]})


Out[25]:

  col1 col2 col3
0  A    CA   1 
1  A    DA   1 
2  B    CA   1 
3  A    CA   2 

我想将这个表按“col3”作为索引,“col1”作为新列(在这种情况下,列是“A”或“B”),值应该是“col2”。

我用pivot_table(也用pivot)试过了:

pd.pivot_table(df1,index='col3', columns="col1", values=['col2'])

在这种情况下,错误为:No numeric types to aggregate,在pivot命令的情况下,错误为:multiple indexes。这两种情况对我来说似乎都是合理的。但是有什么选择吗?当我为一列有两个值时,我更喜欢以下结果:

  A                B
1 ['CA', 'DA']     CA
2  'CA'            NaN

【问题讨论】:

    标签: python pandas pivot pivot-table


    【解决方案1】:

    对于输出中缺少值的所有列表,添加自定义 lambda 函数:

    df1 = pd.pivot_table(df1,index='col3', columns="col1", values='col2',
                         aggfunc = lambda x: x.tolist())
    print (df1)
    col1         A     B
    col3                
    1     [CA, DA]  [CA]
    2         [CA]   NaN
    

    如果需要标量而不是一个元素列表添加if-else 声明:

    df1 = pd.pivot_table(df1,index='col3', columns="col1", values='col2', 
                         aggfunc = lambda x: x.tolist() if len(x) > 1 else x.iat[0])
    print (df1)
    col1         A    B
    col3               
    1     [CA, DA]   CA
    2           CA  NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2015-10-04
      • 2021-03-22
      相关资源
      最近更新 更多