这是一个基本问题。我有一个方形数组,行和列总结。例如:
df = pd.DataFrame([[0,0,1,0], [0,0,1,0], [1,0,0,0], [0,1,0,0]], index = ["a","b","c","d"], columns = ["a","b","c","d"])
df["sumRows"] = df.sum(axis = 1)
df.loc["sumCols"] = df.sum()
返回:
In [100]: df
Out[100]:
a b c d sumRows
a 0 0 1 0 1
b 0 0 1 0 1
c 1 0 0 0 1
d 0 1 0 0 1
sumCols 1 1 2 0 4
我需要找到与之匹配的sumCols行的列标签。目前我正在这样做:
[df.loc["sumCols"] == 0].index
但是这会返回一个奇怪的索引类型对象。我想要的是一个符合这个标准的值列表,例如:[' d']在这种情况下。
答案 0 :(得分:4)
有两种方法(索引对象可以像列表一样转换为可交换的)。
使用列来执行此操作:
columns = df.columns[df.sum()==0]
columns = list(columns)
或者您可以旋转Dataframe并将列视为行:
list(df.T[df.T.sumCols == 0].index)
答案 1 :(得分:2)
您可以使用ERR_SSL_PROTOCOL_ERROR
表达式来过滤系列,如果您想要列表而不是索引作为结果,则可以在索引对象上调用lambda
:
.tolist()
或者:
(df.loc['sumCols'] == 0)[lambda x: x].index.tolist()
# ['d']
如果没有明确创建df.loc['sumCols'][lambda x: x == 0].index.tolist()
# ['d']
,如果要检查哪个列的总和为零,则可以执行以下操作:
sumCols
检查行:
df.sum()[lambda x: x == 0].index.tolist()
# ['d']
注意:df.sum(axis = 1)[lambda x: x == 0].index.tolist()
# []
表达式方法与用于子集化,功能样式的矢量化方法一样快,如果您愿意,可以在单行中轻松编写。
答案 2 :(得分:2)
转换后使用查询的简单方法
df.T.query('sumCols == 0').index.tolist()