行匹配条件的列的索引 Python Pandas
Index of columns where rows match criterion Python Pandas
我有来自 Excel 文件的数据,格式为
0,1,0
1,0,0
0,0,1
我想将这些数据转换成一个列表,其中第 i
个元素指示第 i
行的非零元素的位置。例如,上面的内容是:
[1,0,2]
我试了两种方法都没用:
方式一 (NumPy)
df = pd.read_excel(file,convert_float=False)
idx = np.where(df==1)[1]
这给了我一个奇怪的错误——idx 的长度永远不会与 df 中的行数相同。对于这个数据集,这两个数字总是相等的。 (我仔细检查过,没有空行。)
方式二 (Pandas)
idx = df.where(df==1)
这给了我这样的输出:
52 NaN NaN NaN
53 1 NaN NaN
54 1 NaN NaN
这是合适的形状,但我不知道如何只获取列索引。
设置数据框
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[0,1,0],[1,0,0],[0,0,1]]))
使用np.argwhere
查找元素索引:
np.argwhere(df.values ==1)
returns:
array([[0, 1],
[1, 0],
[2, 2]], dtype=int64)
因此对于第 0 行,第 1 列包含 df 的 1:
0 1 2
0 0 1 0
1 1 0 0
2 0 0 1
注:
(您可以使用 np.array_split(indices, 2,1)[1]
来获取列索引)
这是一个适用于有限用例(包括此用例)的解决方案。如果您知道您的行中只有一个 1
,那么您可以转置原始数据框,以便原始数据框的列索引成为转置数据框的行索引。有了它,您可以找到每一行中的最大值和 return 这些值的数组。
您的原始数据框不是此解决方案的最佳示例,因为它是对称的并且其转置与原始数据框相同。因此,为了这个解决方案,我们将使用如下所示的起始数据框:
df = pd.DataFrame({0:[0,0,1], 1:[1,0,0], 2:[0,1,0]})
# original data frame --> df
0 1 2
0 0 1 0
1 0 0 1
2 1 0 0
# transposed data frame --> df.T
0 1 2
0 0 0 1
1 1 0 0
2 0 1 0
现在求每一行的最大值:
np.array(df.T.idxmax())
其中 returns 值数组表示包含 1 的原始数据框的列索引:
[1 2 0]
我有来自 Excel 文件的数据,格式为
0,1,0
1,0,0
0,0,1
我想将这些数据转换成一个列表,其中第 i
个元素指示第 i
行的非零元素的位置。例如,上面的内容是:
[1,0,2]
我试了两种方法都没用:
方式一 (NumPy)
df = pd.read_excel(file,convert_float=False)
idx = np.where(df==1)[1]
这给了我一个奇怪的错误——idx 的长度永远不会与 df 中的行数相同。对于这个数据集,这两个数字总是相等的。 (我仔细检查过,没有空行。)
方式二 (Pandas)
idx = df.where(df==1)
这给了我这样的输出:
52 NaN NaN NaN
53 1 NaN NaN
54 1 NaN NaN
这是合适的形状,但我不知道如何只获取列索引。
设置数据框
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[0,1,0],[1,0,0],[0,0,1]]))
使用np.argwhere
查找元素索引:
np.argwhere(df.values ==1)
returns:
array([[0, 1],
[1, 0],
[2, 2]], dtype=int64)
因此对于第 0 行,第 1 列包含 df 的 1:
0 1 2
0 0 1 0
1 1 0 0
2 0 0 1
注:
(您可以使用 np.array_split(indices, 2,1)[1]
来获取列索引)
这是一个适用于有限用例(包括此用例)的解决方案。如果您知道您的行中只有一个 1
,那么您可以转置原始数据框,以便原始数据框的列索引成为转置数据框的行索引。有了它,您可以找到每一行中的最大值和 return 这些值的数组。
您的原始数据框不是此解决方案的最佳示例,因为它是对称的并且其转置与原始数据框相同。因此,为了这个解决方案,我们将使用如下所示的起始数据框:
df = pd.DataFrame({0:[0,0,1], 1:[1,0,0], 2:[0,1,0]})
# original data frame --> df
0 1 2
0 0 1 0
1 0 0 1
2 1 0 0
# transposed data frame --> df.T
0 1 2
0 0 0 1
1 1 0 0
2 0 1 0
现在求每一行的最大值:
np.array(df.T.idxmax())
其中 returns 值数组表示包含 1 的原始数据框的列索引:
[1 2 0]