【问题标题】:Pandas: how to unpivot df correctly?熊猫:如何正确取消 df ?
【发布时间】:2022-01-19 16:45:53
【问题描述】:

我有以下数据框df

  A  B  Var    Value
0 A1 B1 T1name T1
1 A2 B2 T1name T1
2 A1 B1 T2name T2
3 A2 B2 T2name T2
4 A1 B1 T1res  1
5 A2 B2 T1res  1
6 A1 B1 T2res  2
7 A2 B2 T2res  2

我现在想“减半”我的数据框,因为 Var 包含不应位于同一列下的变量。我的预期结果是:

  A  B  Name   Value
0 A1 B1 T1     1
1 A2 B2 T1     1
2 A1 B1 T2     2
3 A2 B2 T2     2

我应该使用什么来正确地取消透视?

【问题讨论】:

  • 所以你不想要 Var = T1name 或 T2name 的行?
  • @eshirvana 正确

标签: python pandas dataframe pandas-melt


【解决方案1】:

只需过滤字符串包含res 的位置,并使用 var 列的前两个字符分配一个新列

df[df['Var'].str.contains('res')].assign(Name=df['Var'].str[:2]).drop(columns='Var')

    A   B Value Name
4  A1  B1     1   T1
5  A2  B2     1   T1
6  A1  B1     2   T2
7  A2  B2     2   T2

请注意,这会创建原始 DataFrame 的切片而不是副本

【讨论】:

    【解决方案2】:

    然后:

    df = df[~df['Var'].isin(['T1name','T2name'])]
    

    输出:

        A   B    Var Value
    4  A1  B1  T1res     1
    5  A2  B2  T1res     1
    6  A1  B1  T2res     2
    7  A2  B2  T2res     2
    

    【讨论】:

      【解决方案3】:

      查看 df 有不同的选项。正则表达式似乎位居榜首。如果正则表达式不起作用,也许考虑重新定义您的问题:

      按 dtype 过滤 Value,替换 df 中不需要的字符并重命名列。代码如下

      df[df['Value'].str.isnumeric()].replace(regex=r'res$', value='').rename(columns={'Var':'Name'})
      
          A   B Name Value
      4  A1  B1   T1     1
      5  A2  B2   T1     1
      6  A1  B1   T2     2
      7  A2  B2   T2     2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2021-08-18
        • 1970-01-01
        • 2022-11-03
        • 2021-10-31
        • 1970-01-01
        • 2019-05-04
        相关资源
        最近更新 更多