【问题标题】:Pandas : Pivot row into column熊猫:将行转为列
【发布时间】:2022-12-18 06:17:32
【问题描述】:

以下是我的数据的一个最小示例:

   Id name class_cd class_name
0   1    A     abc1        dog
1   1    A     def2     canine
2   1    A     ghi1       safe
3   2    B     abc1        cat
4   2    B     def2      tabby

可以重现:

df = pd.DataFrame({
    'Id': [1, 1, 1, 2, 2],
    'name':['A', 'A', 'A', 'B', 'B'],
    'class_cd': ['abc1', 'def2', 'ghi1', 'abc1', 'def2'],
    'class_name': ['dog', 'canine', 'safe', 'cat', 'tabby']
})

我希望 class_cd 不同的值成为新列,其中值是关联的 class_name,这样结果中每个 id 都包含一行。

预期结果:

    Id  name    abc1    def2    ghi1
0   1      A     dog  canine    safe
1   2      B     cat   tabby    

如何用 Pandas 实现这一目标?

【问题讨论】:

    标签: python python-3.x pandas dataframe pivot


    【解决方案1】:

    你可以试试:

    (df.pivot(index=['Id', 'name'], columns='class_cd', values='class_name')
     .fillna('')
     .reset_index())
    
    class_cd  Id name abc1    def2  ghi1
    0          1    A  dog  canine  safe
    1          2    B  cat   tabby   
    

    【讨论】:

      【解决方案2】:

      这是pivot 的工作。

      您告诉它要扩展哪些列,以及要在这些新列中放入哪些值。它将使用指定索引中的唯一值在结果中创建行。

      >>> df.pivot(index=['Id','name'], columns='class_cd', values='class_name')
      class_cd abc1    def2  ghi1
      Id name
      1  A      dog  canine  safe
      2  B      cat   tabby   NaN
      

      然后,您可以调用reset_index() 将多索引展平为列。

      class_cd  Id name abc1    def2  ghi1
      0          1    A  dog  canine  safe
      1          2    B  cat   tabby   NaN
      

      【讨论】:

        【解决方案3】:

        作为替代使用crosstab:

        dfx=pd.crosstab([df['Id'],df['name']], df['class_cd'],values=df['class_name'],aggfunc=','.join)
        

        输出:

                  abc1    def2  ghi1
        Id name                    
        1  A      dog  canine  safe
        2  B      cat   tabby   NaN
        

        【讨论】:

          【解决方案4】:

          我想用 pandas 和 sql 来做 1.导入sql

          !pip install pandasql
          
          from pandasql import sqldf
          pysqldf = lambda q: sqldf(q, globals())
          

          从 class_cd 中取出数据帧

          df1=df[df['class_cd']=='abc1']
          df2=df[df['class_cd']=='def2']
          df3=df[df['class_cd']=='ghi3']
          
          
          1. 使用sql连接三张表
          query="""
          select tt1.Id, tt1.name, tt1.abc1,tt1.def2, t3.class_name as 'ghi3'
          from
          (select t1.Id,t1.name,t1.class_name as 'abc1', t2.class_name as 'def2'
          from df1 as t1 
          join df2 as t2 
          on t1.name=t2.name) as tt1
          
          left join df3 as t3
          on tt1.name = t3.name 
          
          """
          
          

          4.结果

          df_result=pysqldf(query)
          print(df_result)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-08
            • 1970-01-01
            • 2019-05-22
            • 1970-01-01
            • 1970-01-01
            • 2019-10-12
            • 2017-04-08
            • 2021-12-18
            相关资源
            最近更新 更多