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

提取列名

家西岭
2023-03-14

我有一个数据帧与二进制值后执行get_dummies使用熊猫

df= 
Values  A1  A2  B1  B2  B3  B4  C1  C2  C3
10      1   0   1   0   0   0   1   0   0
12      0   1   0   0   1   0   0   1   0
3       0   1   0   1   0   0   0   0   1
5       1   0   0   0   0   1   1   0   0

我想要一个新的列,它有所有列的组合,其中有1

Expected output:

Values  A1  A2  B1  B2  B3  B4  C1  C2  C3  Combination
10      1   0   1   0   0   0   1   0   0   A1~~B1~~C1
12      0   1   0   0   1   0   0   1   0   A2~~B3~~C2
3       0   1   0   1   0   0   0   0   1   A2~~B2~~C3
5       1   0   0   0   0   1   1   0   0   A1~~B4~~C3

实际矩阵可以是25000行*1000列

在R中也有类似的解决方案,但是我需要它在Python中,因为所有其他的依赖都在Python中,R对我来说是新的。

在二进制矩阵中提取值为1的列名

Codes in R below, & need similar one or any other code in python which can help me to arrive at my expected output
Solution 1 : 
as.matrix(apply(m==1,1,function(a) paste0(colnames(m)[a], collapse = "")))

Solution 2: 
t <- which(m==1, arr.ind = TRUE)
as.matrix(aggregate(col~row, cbind(row=rownames(t), col=t[,2]), function(x) 
                                                    paste0(colnames(m)[x], collapse = "")))

类似的东西如何才能在Python中达到我的预期输出?

共有3个答案

禄和宜
2023-03-14

您可以在删除您的列后使用熊猫的. dot函数来获得您想要的列名,然后用列表理解处理输出以获得正确的A1~~B1~~C1格式。

看起来是这样的:

tmp = [list(i) for i in list(df.dot(df.columns))]
df['combination'] = ['~~'.join(i) for i in tmp]

print(df)

    A   B   C   D   combination
0   1   1   0   0   A~~B
1   0   1   1   0   B~~C
2   0   0   1   0   C
关苗宣
2023-03-14

您可以使用str.join尝试apply

df["Combination"] = df.drop("Values", axis=1).apply(lambda x: "~~".join(x[x != 0].index), axis=1)

print(df)
#    Values  A1  A2  B1  B2  B3  B4  C1  C2  C3 Combination
# 0      10   1   0   1   0   0   0   1   0   0  A1~~B1~~C1
# 1      12   0   1   0   0   1   0   0   1   0  A2~~B3~~C2
# 2       3   0   1   0   1   0   0   0   0   1  A2~~B2~~C3
# 3       5   1   0   0   0   0   1   1   0   0  A1~~B4~~C1

解释:

  1. 要计算组合,请忽略列。几种方法是可能的(见本主题)。在这里我使用dropdf.drop(值,轴=1)
  2. 在每一行应用自定义函数,使用应用轴=1
  3. 在函数中,使用x[x!=0]
  4. 使用. index
  5. 选择列名(这里有Serie的索引)
  6. 使用str.join匹配所需的输出:"~~"。=0]. index)

完整说明:

# Step 1
print(df.drop("Values", axis=1))
#    A1  A2  B1  B2  B3  B4  C1  C2  C3
# 0   1   0   1   0   0   0   1   0   0
# 1   0   1   0   0   1   0   0   1   0
# 2   0   1   0   1   0   0   0   0   1
# 3   1   0   0   0   0   1   1   0   0

# Step 3
print(df.drop("Values", axis=1).apply(lambda x: x[x != 0], axis=1))
#     A1   A2   B1   B2   B3   B4   C1   C2   C3
# 0  1.0  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN
# 1  NaN  1.0  NaN  NaN  1.0  NaN  NaN  1.0  NaN
# 2  NaN  1.0  NaN  1.0  NaN  NaN  NaN  NaN  1.0
# 3  1.0  NaN  NaN  NaN  NaN  1.0  1.0  NaN  NaN

# Step 4
print(df.drop("Values", axis=1).apply(lambda x: x[x != 0].index, axis=1))
# 0    Index(['A1', 'B1', 'C1'], dtype='object')
# 1    Index(['A2', 'B3', 'C2'], dtype='object')
# 2    Index(['A2', 'B2', 'C3'], dtype='object')
# 3    Index(['A1', 'B4', 'C1'], dtype='object')

# Step 5
df["Combination"] = df.drop("Values", axis=1).apply(lambda x: "~~".join(x[x != 0].index), axis=1)
print(df)
#    Values  A1  A2  B1  B2  B3  B4  C1  C2  C3 Combination
# 0      10   1   0   1   0   0   0   1   0   0  A1~~B1~~C1
# 1      12   0   1   0   0   1   0   0   1   0  A2~~B3~~C2
# 2       3   0   1   0   1   0   0   0   0   1  A2~~B2~~C3
# 3       5   1   0   0   0   0   1   1   0   0  A1~~B4~~C1
澹台季萌
2023-03-14
df["Combination"] = df.iloc[:, 1:].dot(df.add_suffix("~~").columns[1:]).str[:-2]

我们使用iloc选择除以外的列,然后形成点积,其中第二个操作数是df的各个列,并在末尾添加~。结果给出了~的结尾,所以我们用.str[:-2]

得到

   Values  A1  A2  B1  B2  B3  B4  C1  C2  C3 Combination
0      10   1   0   1   0   0   0   1   0   0  A1~~B1~~C1
1      12   0   1   0   0   1   0   0   1   0  A2~~B3~~C2
2       3   0   1   0   1   0   0   0   0   1  A2~~B2~~C3
3       5   1   0   0   0   0   1   1   0   0  A1~~B4~~C1
 类似资料:
  • 序列提取 上一章讲述了如何实现自定义的提取器以及如何在模式匹配中使用它们, 但是只讨论了如何从给定的数据结构中分解固定数目的参数。 对某种数据结构来说,Scala 提供了提取任意多个参数的模式匹配方法。 比如,你可以匹配只有两个、或者只有三个元素的列表: val xs = 3 :: 6 :: 12 :: Nil xs match { case List(a, b) => a * b case

  • 我的问题是: 如何从按列划分的PDF文件中提取文本,以获得由该列分隔的结果? 背景:我从事一个关于文本分析(尤其是科学文本)的项目。这些文本有时以多列布局发布,每列都有单独的页码。要按布局页码对提取的文本进行排序,按列提取文本会很有用。 我使用pdfBox并尝试/搜索了以下内容: 我尝试了类的getThreadBeads()方法- 问题是pdfBox似乎会自动将文本按列划分:如果我将PDFText

  • 我有一个表格,我需要提取一些信息。这个表有一个oracle spatial (MDSYS。SDO_GEOMETRY)列,从中我也需要一些数据。 我从一个简单的查询开始,如下所示: 在那之后,我能够循环结果以提取空间列中的数据: 位置图。sdo_ 我需要最后2个值。我可以通过将查询更改为以下内容来实现: 在第一次查询的每一行上循环以从POSITIONMAP列中提取数据当然不是很好的性能友好,因此我的

  • 如何从CSV文件中提取列? 我对Java有点陌生。你如何从csv文件中提取特定列。例如,如果我有这个数据: 如何提取第一列和第三列?我能够读取整个CSV文件,但我想从中提取特定的列。

  • 问题内容: 我有一个针对单行中的单个列的mysql查询 执行语句后,如何将单个单元格直接放入没有循环的变量中?换句话说,如何获得 我尝试了下面的2,但均无济于事。。该列在原始表中为4,但是我假设因为在我的select语句中我只是选择它,所以当我为fetchColumn指定参数时,它应该为1。 如您所见,我正在尝试以尽可能少的行来完成。 问题答案: 您确定要返回任何行吗? 是获取单个值的正确方法,因