【问题标题】:Get name of the row in dataframe (python pandas)获取数据框中行的名称(python pandas)
【发布时间】:2016-02-25 08:23:09
【问题描述】:

例如,我有一个数据框,它有 5 行和 5 列。它们具有相同的名称。示例:

...A B C D E

A 0 0 0 0 0

B 0 0 0 0 0

C 0 0 0 0 0

D 0 0 0 0 0

E 0 0 0 0 0

如何通过我的数据框进行循环以比较列名和行名,以便在列名和行名相等的情况下设置值 1。

...A B C D E

A 1 0 0 0 0

B 0 1 0 0 0

C 0 0 1 0 0

D 0 0 0 1 0

E 0 0 0 0 1

【问题讨论】:

  • 或者我应该使用其他结构来完成这样的任务?此外,我需要这些数据进行数据分析
  • 重点是获取列名和行名的获取方法
  • 别忘了接受最适合您的答案。

标签: python loops pandas


【解决方案1】:

您可以使用numpy.fill_diagonal 作为数据框的值:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.zeros((5,5)), columns=list('ABCDE'), index=list("ABCDE"))

In [37]: np.fill_diagonal(df.values, 1)

In [38]: df
Out[38]:
   A  B  C  D  E
A  1  0  0  0  0
B  0  1  0  0  0
C  0  0  1  0  0
D  0  0  0  1  0
E  0  0  0  0  1

编辑

如果您需要填充行和列索引相同的值,您可以使用对角线的值进行切片,然后将其分配给您想要的任何值:

df = pd.DataFrame(np.zeros((5,5)), columns=list('ABCDE'), index=list("ABCGE"))
mask = df.columns == df.index
df.values[mask, mask] = 1

In [72]: df
Out[72]:
   A  B  C  D  E
A  1  0  0  0  0
B  0  1  0  0  0
C  0  0  1  0  0
G  0  0  0  0  0
E  0  0  0  0  1

【讨论】:

  • 我认为这不起作用,因为如果你像df = pd.DataFrame(np.zeros((5,5)), columns=list('ABCDE'), index=list("ABCGE")) 一样更改df,输出是一样的。您只需将1 添加到对角线,OP 需要比较。
  • 我的回答解决了这个问题——尽管不清楚 OP 需要什么。
  • @jezrael 感谢您指出这一点。编辑后的版本应该可以工作。
  • 但是如果列长度不等于索引长度怎么办?如果我需要查看 A == C 是否使值等于 1 怎么办。重点是如何比较索引 NAMES 和列 NAMES。
  • @user3828374 df.columns 将为您提供所有列 NAMES。根据您想要的内容和数据框编辑您的问题。
【解决方案2】:

或者如果你的行和列没有排序:

df.apply(lambda row: row.index == row.name, axis=1).astype(int)

末尾的.astype(int) 将布尔值转换为整数。

【讨论】:

  • 也可以按列申请:df.apply(lambda col: col.index == col.name).astype(int).
  • 不同之处在于您将, axis=1 留出可以节省8 个字符;)
  • 但是如果列长度不等于索引长度怎么办?如果我需要查看 A == C 然后使值等于 1 怎么办。重点是如何比较索引 NAMES 和列 NAMES。
  • 当数据框不是正方形时,我的解决方案同样有效。由于我按行迭代,row.index 是行索引的(标量)值,而row.name 是列名列表。
猜你喜欢
  • 2015-01-31
  • 2016-11-12
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多