如何按列名称切片数据框的多个部分?

时间:2019-11-22 15:30:50

标签: python pandas

如何获得第一列,然后添加另一个切片?

例如:

import pandas as pd
df = pd.DataFrame(pd.np.random.rand(6,6), columns = list('abcdef'))

          a         b         c         d         e         f
0  0.147163  0.710360  0.069732  0.180949  0.694066  0.639505
1  0.771643  0.094805  0.371702  0.177538  0.089168  0.420331
2  0.431394  0.790537  0.378049  0.402930  0.350409  0.827950
3  0.421411  0.451595  0.703630  0.469526  0.612122  0.076728
4  0.854117  0.302925  0.664647  0.664098  0.959504  0.637122
5  0.659791  0.525526  0.007151  0.448761  0.738571  0.349142

我正在尝试获取列ac之后的所有列。

这给了我c,d,e,f列:

df.loc[:'a', 'c':]

这根本不起作用:

df.loc['a':'a', 'c':]

我做了几次尝试,但它们只是随机猜测,我真的无法在线找到解决方案。

注意:我正在处理一个巨大的真实数据框,因此写像df.loc[:,['a','c','d','e','f]]

这样的单个列名将是不切实际的

4 个答案:

答案 0 :(得分:5)

我理解的问题是如何通过列名进行选择。

不容易,因为首先需要使用Index.get_loc的职位,然后通过numpy.r_进行选择将其传递给DataFrame.iloc

a = df.columns.get_loc('a')
b = df.columns.get_loc('c')
c = len(df.columns)

df = df.iloc[:, np.r_[a, b:c]]
print (df)
          a         c         d         e         f
0  0.210653  0.218035  0.845753  0.456271  0.279802
1  0.932892  0.909715  0.043418  0.707115  0.483889
2  0.444221  0.040683  0.332754  0.947120  0.617660
3  0.368875  0.206132  0.165066  0.361817  0.863353
4  0.509402  0.950252  0.815966  0.322974  0.972098
5  0.987351  0.655923  0.405653  0.257348  0.082653

答案 1 :(得分:4)

我们可以做np.r_

df.iloc[:,np.r_[0,2:df.shape[1]]]
Out[99]: 
          a         c         d         e         f
0  0.147163  0.069732  0.180949  0.694066  0.639505
1  0.771643  0.371702  0.177538  0.089168  0.420331
2  0.431394  0.378049  0.402930  0.350409  0.827950
3  0.421411  0.703630  0.469526  0.612122  0.076728
4  0.854117  0.664647  0.664098  0.959504  0.637122
5  0.659791  0.007151  0.448761  0.738571  0.349142

要获得职位get_indexer

df.columns.get_indexer(['c'])
Out[100]: array([2], dtype=int64)

通用

def drop_from_here_to_there(df, here, there):
    n, m = df.shape
    i, j = df.columns.get_indexer([here, there])
    k = np.r_[0:i+1, j:m]
    return df.iloc[:, k]

drop_from_here_to_there(df, 'a', 'c')

          a         c         d         e         f
0  0.147163  0.069732  0.180949  0.694066  0.639505
1  0.771643  0.371702  0.177538  0.089168  0.420331
2  0.431394  0.378049  0.402930  0.350409  0.827950
3  0.421411  0.703630  0.469526  0.612122  0.076728
4  0.854117  0.664647  0.664098  0.959504  0.637122
5  0.659791  0.007151  0.448761  0.738571  0.349142

答案 2 :(得分:2)

drop

df.drop('b', axis=1)

          a         c         d         e         f
0  0.147163  0.069732  0.180949  0.694066  0.639505
1  0.771643  0.371702  0.177538  0.089168  0.420331
2  0.431394  0.378049  0.402930  0.350409  0.827950
3  0.421411  0.703630  0.469526  0.612122  0.076728
4  0.854117  0.664647  0.664098  0.959504  0.637122
5  0.659791  0.007151  0.448761  0.738571  0.349142

答案 3 :(得分:0)

您可以使用带有列名列表的调用数据框来获取所需的数据框。首先,我们将获取所有列的列表,然后在列列表上使用切片,将切片的列馈入数据框。

df.columns.to_list()
['a', 'b', 'c', 'd', 'e', 'f']

切片

cols = df.columns.to_list()
cols = cols[:1] + cols[2:]
cols
['a', 'c', 'd', 'e', 'f']

用cols呼叫df

df[cols]
          a         c         d         e         f
0  0.749754  0.291974  0.638897  0.768337  0.255553
1  0.541221  0.816086  0.472628  0.276530  0.946075
2  0.811953  0.692716  0.729467  0.512503  0.589812
3  0.613418  0.588730  0.497962  0.122666  0.153101
4  0.600428  0.897041  0.643585  0.382276  0.164303
5  0.165782  0.107455  0.149544  0.309294  0.544864