【问题标题】:how to unstack or unpivot a pandas dataframe based on conditional row values?如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?
【发布时间】:2021-04-13 22:29:16
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

但我需要将桌子和椅子拉到各自的列中以像这样并排比较:

所以数量的值为零,现在出现在新列中。

我不确定如何有条件地取消堆叠。我可以取消堆叠整个“家具”列,但如何仅针对特定的行值取消堆叠?

【问题讨论】:

    标签: pandas unpivot


    【解决方案1】:

    让我们试试get_dummies

    df = df.join(df.furniture.where(df.furniture.isin(["table","chair"]),'amount').str.get_dummies().mul(df.pop("amount"),0))
    df
    Out[87]: 
       CID furniture  amount  chair  table
    0    1     couch       2      0      0
    1    2     couch       3      0      0
    2    2     chair       0      1      0
    3    3     table       0      0      3
    4    1     chair       0      1      0
    5    4      lamp       5      0      0
    6    4     chair       0      1      0
    7    5     couch       2      0      0
    8    2      lamp       5      0      0
    

    【讨论】:

    • 发布后我想,我可以取消堆叠整个列,设置索引,然后只堆叠所需的列,但这更干净。谢谢!
    【解决方案2】:

    您可以创建一个掩码,然后使用布尔索引:

    m_table = df["furniture"] == "table"
    m_chair = df["furniture"] == "chair"
    
    df["table"] = np.where(m_table, df["amount"], 0)
    df["chair"] = np.where(m_chair, df["amount"], 0)
    
    df.loc[m_table | m_chair, "amount"] = 0
    print(df)
    

    打印:

       CID furniture  amount  table  chair
    0    1     couch       2      0      0
    1    2     couch       3      0      0
    2    2     chair       0      0      1
    3    3     table       0      3      0
    4    1     chair       0      0      1
    5    4      lamp       5      0      0
    6    4     chair       0      0      1
    7    5     couch       2      0      0
    8    2      lamp       5      0      0
    

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多