tom*_*z74 4 python slice pandas
我有大型DataFrame与GPS路径和一些属性.路径的一些部分是我需要分析的部分.我想仅将这些部分子集化为新的DataFrame.我可以在当时对一个部分进行子集化,但我们的想法是将它们全部包含在原始索引中.
问题类似于:
import pandas as pd
df = pd.DataFrame({'A':[0,1,2,3,4,5,6,7,8,9],'B':['a','b','c','d','e','f','g','h','i','j']},
index=range(10,20,))
Run Code Online (Sandbox Code Playgroud)
我希望得到类似的东西:
cdf = df.loc[[11:13] & [17:20]] # SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
期望的结果:
A B
11 1 b
12 2 c
13 3 d
17 7 h
18 8 i
19 9 j
Run Code Online (Sandbox Code Playgroud)
我知道这个例子很容易,cdf = df.loc[[11,12,13,17,18,19],:]但在最初的问题中我有数千行和一些条目已被删除,所以列出点不是一个选项.
您可以使用np.r_连接切片:
In [16]: df.loc[np.r_[11:13, 17:20]]
Out[16]:
A B
11 1 b
12 2 c
17 7 h
18 8 i
19 9 j
Run Code Online (Sandbox Code Playgroud)
但是请注意,是
df.loc[A:B]选择标签A通过B与B包括在内.
np.r_[A:B]返回一个带有排除的A直通数组.要包括你需要使用.BBBnp.r_[A:B+1]
传递切片时,例如df.loc[A:B],df.loc忽略不在的切片df.index.相反,当传递一个数组时,例如df.loc[np.r_[A:B]],df.loc可以为数组中不存在的每个值添加一个填充了NaN的新行df.index.
因此,为了产生所需的结果,您需要调整切片的正确端点并用于isin测试成员身份df.index:
In [26]: df.loc[df.index.isin(np.r_[11:14, 17:21])]
Out[26]:
A B
11 1 b
12 2 c
13 3 d
17 7 h
18 8 i
19 9 j
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案concat:
cdf = pd.concat([df.loc[11:13], df.loc[17:20]])
print (cdf)
A B
11 1 b
12 2 c
13 3 d
17 7 h
18 8 i
19 9 j
Run Code Online (Sandbox Code Playgroud)
另一个解决方案range:
cdf = df.loc[list(range(11,14)) + list(range(17,20))]
print (cdf)
A B
11 1 b
12 2 c
13 3 d
17 7 h
18 8 i
19 9 j
Run Code Online (Sandbox Code Playgroud)