如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python pandas 根据条件将行值复制到另一列

如何在 pandas.DataFrame 中插入满足条件的行值

如果您使用 pandas 数据框知道列值和行值,如何检索数据? [复制]

如何根据某些分组列取消pandas数据框? [复制]

PYTHON Pandas - 根据其他数据帧中的值对数据帧使用 Pandas 样式

pandas 在同一张表(相同的数据框)中,如何用新名称和其他行值的总和对不同的行进行分组