我有一个熊猫数据结构,我这样创建:
test_inputs = pd.read_csv("../input/test.csv", delimiter=',')
它的形状
print(test_inputs.shape)
是这个
(28000, 784)
我想打印其行的子集,如下所示:
print(test_inputs[100:200, :])
print(test_inputs[100:200, :].shape)
然而,我得到了:
TypeError: unhashable type: 'slice'
知道可能出现什么问题吗?
答案 0 :(得分:8)
大熊猫中的索引真的令人困惑,因为它看起来像列表索引,但事实并非如此。您需要使用.iloc
,它按位置索引
print(test_inputs.iloc[100:200, :])
如果你不使用列选择,你可以省略它
print(test_inputs.iloc[100:200])
P.S。使用.loc
(或只是[]
)不是你想要的,因为它看起来不是行号,而是行索引(可以填充任何东西,甚至不是数字,甚至不是独特)。 .loc
中的范围将找到索引值为100和200的行,并返回它们之间的行。如果您刚刚创建了DataFrame .iloc
而.loc
可能会给出相同的结果,但在这种情况下使用.loc
是一种非常糟糕的做法,因为它会导致您难以理解的问题索引会因某种原因而改变(例如,您将选择某些行的子集,从那时起,行号和索引将不相同)。
答案 1 :(得分:5)
有更多可能的解决方案,但输出不相同:
loc
按标签选择,但是iloc
并且没有函数切片,起始边界是包含,而上限是排除, docs - select by positions:
test_inputs = pd.DataFrame(np.random.randint(10, size=(28, 7)))
print(test_inputs.loc[10:20])
0 1 2 3 4 5 6
10 3 2 0 6 6 0 0
11 5 0 2 4 1 5 2
12 5 3 5 4 1 3 5
13 9 5 6 6 5 0 1
14 7 0 7 4 2 2 5
15 2 4 3 3 7 2 3
16 8 9 6 0 5 3 4
17 1 1 0 7 2 7 7
18 1 2 2 3 5 8 7
19 5 1 1 0 1 8 9
20 3 6 7 3 9 7 1
print(test_inputs.iloc[10:20])
0 1 2 3 4 5 6
10 3 2 0 6 6 0 0
11 5 0 2 4 1 5 2
12 5 3 5 4 1 3 5
13 9 5 6 6 5 0 1
14 7 0 7 4 2 2 5
15 2 4 3 3 7 2 3
16 8 9 6 0 5 3 4
17 1 1 0 7 2 7 7
18 1 2 2 3 5 8 7
19 5 1 1 0 1 8 9
print(test_inputs[10:20])
0 1 2 3 4 5 6
10 3 2 0 6 6 0 0
11 5 0 2 4 1 5 2
12 5 3 5 4 1 3 5
13 9 5 6 6 5 0 1
14 7 0 7 4 2 2 5
15 2 4 3 3 7 2 3
16 8 9 6 0 5 3 4
17 1 1 0 7 2 7 7
18 1 2 2 3 5 8 7
19 5 1 1 0 1 8 9
答案 2 :(得分:0)
我面临着同样的问题。即使上述解决方案也无法解决。大熊猫遇到了一些问题,我所做的是将数组更改为numpy数组,然后没有问题。
UIControl
答案 3 :(得分:0)
print(test_inputs.values[100:200, :])
print(test_inputs.values[100:200, :].shape)
此代码也对我有用。