当前位置: 首页 > 知识库问答 >
问题:

使用列名作为值标签将多个列合并为一个类别列

闾丘鸣
2023-03-14

我有这些数据

   ID      A      B      C
0   0   True  False  False
1   1  False   True  False
2   2  False  False   True

我想把它变成

   ID group
0   0     A
1   1     B
2   2     C
    < li >我想将列名用作< code>category列的值标签。 < li >每行最多只有一个< code>True值。

这就是MWE

#!/usr/bin/env python3
import pandas as pd

df = pd.DataFrame({
    'ID': range(3),
    'A': [True, False, False],
    'B': [False, True, False],
    'C': [False, False, True]
})

result = pd.DataFrame({
    'ID': range(3),
    'group': ['A', 'B', 'C']
})
result.group = result.group.astype('category')

print(df)
print(result)

我可以做 df.apply(lambda 行: ...魔术.., 轴=1)。但是,熊猫自己的工具不是有更优雅的方式吗?

共有3个答案

陈和裕
2023-03-14

还有另一种方式:

df.set_index(['ID'])\
  .rename_axis('group', axis=1)\ # getting column name correct
  .stack()\                      # reshaping getting column headers into dataframe rows
  .loc[lambda x: x]\             # filtering for True
  .reset_index()\                # moving ID back into dataframe columns
  .drop(0, axis=1)               # dropping boolean column

输出:

   ID group
0   0     A
1   1     B
2   2     C
夏涵畅
2023-03-14

您可以使用df.dot

df['group'] = df[['A', 'B', 'C']].dot(df.columns[1:])
华升
2023-03-14

您可以使用<code>pd。melt()来重新形状和重命名,然后使用<code>查询

pd.melt(df,id_vars=['ID'],var_name= 'group').query('value') \
    .drop('value',axis=1).reset_index(drop=True)

   ID group
0   0     A
1   1     B
2   2     C
 类似资料:
  • 问题内容: 我正在写一个小脚本来帮助日本假名记忆。我如何将以下列表合并为一个?我尝试如下。 问题答案: 单程:

  • 我想合并火花中的多个数组类型[字符串类型]列以创建一个数组类型[字符串类型]。为了组合两列,我在这里找到了解决方案: 将Array[string]类型的两个spark sql列合并成一个新的Array[string]列 但是如果我不知道编译时的列数,我该如何进行组合呢?在运行时,我将知道所有要组合的列的名称。 一种选择是使用上面stackoverflow问题中定义的UDF,在循环中多次添加两列。但

  • 问题内容: 这个问题已经在这里有了答案 : 如何在Python中将两个列表组合成字典?[重复] (6个答案) 5年前关闭。 Python中是否有将两个列表合并成字典的 内置 函数?喜欢: 哪里: 充当包含键的列表。 充当包含值的列表 有一个名为array_combine的函数可以实现此效果。 问题答案: 似乎这样应该可以,尽管我猜这不是 一个 单一的功能: 从这里开始:如何在Python中将两个列

  • 问题内容: 我有 我想要 问题答案:

  • 本文向大家介绍MySQL查询将两列合并为一个列?,包括了MySQL查询将两列合并为一个列?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用功能。在该函数中,它从列中返回第一个NON NULL值。为了理解这个概念,让我们首先创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 现在,您可以使用select语句显示表中的所有记录。查询如下- 以下是输出 这是将两列合并为一个查询的

  • 问题内容: 我想将3个列表合并到一个列表中。例如,我有三个列表: 最后我想得到 出,, 有没有更快的方法来合并这三个列表?这是我的代码: 问题答案: