【问题标题】:Create columns based on rows根据行创建列
【发布时间】:2022-11-17 13:53:03
【问题描述】:

我是熊猫的新手,我正在寻找一种转换此数据框的好方法:

Date Name Value
01-01-2022 A 0
01-01-2022 B 1
01-01-2022 C 1
02-01-2022 A 1
02-01-2022 B 1
02-01-2022 C 0

对于这个数据框:

Name Value_before Value_after
A 0 1
B 1 1
C 1 0

第一个表仅包含两个日期的数据。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    假设:

    • 你只有两个日期
    • 每个日期没有重复的名字

    您可以使用 pivot 利用 pivot 对列进行排序,然后使用 set_axis 使用您的自定义名称

    out = (df
       .assign(Date=pd.to_datetime(df['Date']))  # ensure datetime for correct sorting
       .pivot('Name', 'Date', 'Value')
       .set_axis(['Value_before', 'Value_after'], axis=1)
       .reset_index()
    )
    

    输出:

      Name  Value_before  Value_after
    0    A             0            1
    1    B             1            1
    2    C             1            0
    

    【讨论】:

      【解决方案2】:

      你要找的是pivot tables

      import pandas as pd
      from datetime import date
      
      df = pd.DataFrame({
          "Date": [date(2022,1,1), date(2022,1,1), date(2022,1,1), date(2022,1,2), date(2022,1,2), date(2022,1,2)],
          "Name": ["A", "B", "C", "A", "B", "C"],
          "Value": [0, 1, 1, 1, 1, 0]
      })
      
      print(pd.pivot_table(df, values="Value", index="Name", columns="Date"))
      

      【讨论】:

        【解决方案3】:
        def function1(dd:pd.DataFrame):
            dd1=dd.loc[:,'Value']
            dd1.index=['Value_before','Value_after']
            return dd1
        df1.groupby("Name").apply(function1)
        
        Value  Value_before  Value_after
        Name                            
        A                 0            1
        B                 1            1
        C                 1            0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-24
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2016-08-16
          • 1970-01-01
          相关资源
          最近更新 更多