Python相当于R c()函数?

时间:2015-09-07 17:44:29

标签: python r pandas

我想使用列索引从pandas数据帧特定列中进行选择。

特别是,我想通过R中c(12:26,69:85,96:99,134:928,933:935,940:967)生成的列索引选择列索引。我想知道如何在Python中执行此操作?

我正在考虑以下内容,但当然,python没有一个名为c()的函数......

input2 = input2.iloc[:,c(12:26,69:85,96:99,134:928,933:935,940:967)]

3 个答案:

答案 0 :(得分:5)

将@hrbrmstr的评论放到答案中,因为它解决了我的问题,我想说清楚这个问题已经解决了。另外,请注意范围(a,b)给出数字(a,a + 1,...,b-2,b-1),并且不包括b。

R&#39组合功能

c(4,12:26,69:85,96:99,134:928,933:935)

被翻译成Python

[4] + list(range(12,27)) + list(range(69,86)) + list(range(96,100)) + list(range(134,929)) + list(range(933,936))

答案 1 :(得分:4)

相当于numpy的r_。它结合了切片而无需为每个切片调用范围:

np.r_[2:4, 7:11, 21:25]
Out: array([ 2,  3,  7,  8,  9, 10, 21, 22, 23, 24])
df = pd.DataFrame(np.random.randn(1000))
df.iloc[np.r_[2:4, 7:11, 21:25]]
Out: 
           0
2   2.720383
3   0.656391
7  -0.581855
8   0.047612
9   1.416250
10  0.206395
21 -1.519904
22  0.681153
23 -1.208401
24 -0.358545

答案 2 :(得分:0)

要回答实际问题,

  

R c()函数的Python等效功能,用于数据框列索引吗?

我使用的是c()

的定义
c = lambda v: v.split(',') if ":" not in v else eval(f'np.r_[{v}]')

然后我们可以做类似的事情:

df = pd.DataFrame({'x': np.random.randn(1000),
                   'y': np.random.randn(1000)})
# row selection
df.iloc[c('2:4,7:11,21:25')] 

# columns by name
df[c('x,y')] 

# columns by range
df.T[c('12:15,17:25,500:750')]

就象R一样的语法而言,这差不多。

好奇的心

请注意,按照上述规定使用c()会导致性能下降。 np.r_。释义Knuth,让我们不要过早优化;-)

%timeit np.r_[2:4, 7:11, 21:25]
27.3 µs ± 786 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit c("2:4, 7:11, 21:25")
53.7 µs ± 977 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)