python取数据框的几列_关于python:如何在pandas中获取数据框的列切片

我从CSV文件加载了一些机器学习数据。 前两列是观察值,其余两列是要素。

目前,我执行以下操作:

1data = pandas.read_csv('mydata.csv')

它给出了类似的东西:

1data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

我想将此数据帧切成两个数据帧:一个包含列a和b,另一个包含列c,d和e。

不可能写这样的东西

1

2observations = data[:'c']

features = data['c':]

我不确定最好的方法是什么。 我需要pd.Panel吗?

顺便说一下,我发现数据帧索引非常不一致:允许使用data['a'],但是不允许使用data[0]。 另一方面,不允许使用data['a':],但是允许使用data[0:]。

是否有实际原因? 鉴于data[0] != data[0:1],如果列被Int索引,这确实令人困惑

当执行df [...]时,DataFrame本质上是一个类似dict的对象,但是有些便利,例如 添加df[5:10]用于选择行(pandas.pydata.org/pandas-docs/stable/)

那么,这种不一致性是为了方便而做出的设计决定吗? 好的,但是对于初学者来说绝对需要更加明确!

支持便利性的设计考虑使学习曲线变得陡峭。 我希望刚开始时有更好的文档,只是介绍一个一致的界面。 例如,仅关注ix界面。

2017年答案-熊猫0.20:.ix已弃用。使用.loc

请参阅文档中的弃用

.loc使用基于标签的索引来选择行和列。标签是索引或列的值。用.loc切片包括最后一个元素。

Let's assume we have a DataFrame with the following columns:

foo, bar, quz, ant, cat, sat, dat.

1

2

3# selects all rows and all columns beginning at 'foo' up to and including 'sat'

df.loc[:, 'foo':'sat']

# foo bar quz ant cat sat

.loc接受与Python列表对行和列所做的相同的切片表示法。切片符号为start:stop:step

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29# slice from 'foo' to 'cat' by every 2nd column

df.loc[:, 'foo':'cat':2]

# foo quz cat

# slice from the beginning to 'bar'

df.loc[:, :'bar']

# foo bar

# slice from 'quz' to the end by 3

df.loc[:, 'quz'::3]

# quz sat

# attempt from 'sat' to 'bar'

df.loc[:, 'sat':'bar']

# no columns returned

# slice from 'sat' to 'bar'

df.loc[:, 'sat':'bar':-1]

sat cat ant quz bar

# slice notation is syntatic sugar for the slice function

# slice from 'quz' to the end by 2 with slice function

df.loc[:, slice('quz',None, 2)]

# quz cat dat

# select specific columns with a list

# select columns foo, bar and dat

df.loc[:, ['foo','bar','dat']]

# foo bar dat

您可以按行和列进行切片。例如,如果您有5行带有标签v,w,x,y,z

1

2

3

4

5

6# slice from 'w' to 'y' and 'foo' to 'ant' by 3

df.loc['w':'y', 'foo':'ant':3]

# foo ant

# w

# x

# y

如果您使用lambda行应用,例如:df[newcol] = df.apply(lambda row: myfunc(row), axis=1),则可以在myfunc(row){中使用... row[foo:ant]。例如(根据此StackOverflow答案),您可以在myfunc内部评估其中是否有任何非数字内容:row[foo:ant].apply(lambda x: isinstance(x, str)).any()

现在应使用.iloc,而不是.loc。修复该问题,并对此进行表决。

您想要访问的是DataFrame.ix索引。这有点令人困惑(我同意熊猫索引有时会令人困惑!),但是以下内容似乎可以满足您的要求:

1

2

3

4

5

6

7>>> df = DataFrame(np.random.rand(4,5), columns = list('abcde'))

>>> df.ix[:,'b':]

b c d e

0 0.418762 0.042369 0.869203 0.972314

1 0.991058 0.510228 0.594784 0.534366

2 0.407472 0.259811 0.396664 0.894202

3 0.726168 0.139531 0.324932 0.906575

其中.ix [row slice,column slice]是正在解释的内容。有关熊猫索引的更多信息,请访问:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced

注意:自熊猫v0.20起不推荐使用.ix。您应该视情况使用.loc或.iloc。

注意熊猫的范围包括两个端点,即>>>data.ix[:, a:c] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159

这样可以传递多列df.ix[:,[0,3,4]]

@Karmel:上面的输出中似乎有复制/粘贴错误。也许您是说df.ix[:,b:e]?

最好使用loc而不是ix:stackoverflow.com/a/31593712/4323

像这样的旧答案需要删除。 .ix已弃用,切勿使用。

让我们以seaborn包中的钛酸数据集为例

1

2

3# Load dataset (pip install seaborn)

>> import seaborn.apionly as sns

>> titanic = sns.load_dataset('titanic')

using the column names

1>> titanic.loc[:,['sex','age','fare']]

using the column indices

1>> titanic.iloc[:,[2,3,6]]

using ix (Older than Pandas

1>> titanic.ix[:,[‘sex’,’age’,’fare’]]

要么

1>> titanic.ix[:,[2,3,6]]

using the reindex method

1>> titanic.reindex(columns=['sex','age','fare'])

在熊猫0.20中:不推荐使用.ix。

另外,给定一个DataFrame

data

如您的示例所示,如果您只想提取a和d列(即第1列和第4列),则需要熊猫数据框中的iloc方法,并且可以非常有效地使用它。您只需要知道要提取的列的索引即可。例如:

1>>> data.iloc[:,[0,3]]

会给你

1

2

3

4

5

6

7

8

9

10

11a d

0 0.883283 0.100975

1 0.614313 0.221731

2 0.438963 0.224361

3 0.466078 0.703347

4 0.955285 0.114033

5 0.268443 0.416996

6 0.613241 0.327548

7 0.370784 0.359159

8 0.692708 0.659410

9 0.806624 0.875476

您可以通过引用列表中每一列的名称来沿DataFrame的列进行切片,如下所示:

1

2

3data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

data_ab = data[list('ab')]

data_cde = data[list('cde')]

因此,如果我希望所有数据都从列b开始,则需要在data.columns中找到b的索引,然后执行data [data.columns [1:]]吗?那就是规范的操作方式?

您是说要从b开始选择所有列?

是的,或者选择给定范围内的所有列。

我对熊猫本人来说还很陌生,所以我不能说什么被认为是规范的。我会像您说的那样做,但是在data.columns上使用get_loc函数来确定b列的索引或其他内容。

如果您来这里是想对两个范围的列进行切片并将它们组合在一起(例如我),则可以执行以下操作

1

2op = df[list(df.columns[0:899]) + list(df.columns[3593:])]

print op

这将创建一个具有前900列和(所有)列> 3593的新数据框(假设数据集中有4000列)。

太好了,有人尝试过了...我想知道,这个0:899可以得到前900列。.为什么他们这样做呢?感觉根本不像Python。在python中使用范围时,它总是直到不被包含

这是您可以使用不同方法进行选择性列切片的方法,包括基于选择性标签,基于索引和基于选择性范围的列切片。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44In [37]: import pandas as pd

In [38]: import numpy as np

In [43]: df = pd.DataFrame(np.random.rand(4,7), columns = list('abcdefg'))

In [44]: df

Out[44]:

a b c d e f g

0 0.409038 0.745497 0.890767 0.945890 0.014655 0.458070 0.786633

1 0.570642 0.181552 0.794599 0.036340 0.907011 0.655237 0.735268

2 0.568440 0.501638 0.186635 0.441445 0.703312 0.187447 0.604305

3 0.679125 0.642817 0.697628 0.391686 0.698381 0.936899 0.101806

In [45]: df.loc[:, ["a","b","c"]] ## label based selective column slicing

Out[45]:

a b c

0 0.409038 0.745497 0.890767

1 0.570642 0.181552 0.794599

2 0.568440 0.501638 0.186635

3 0.679125 0.642817 0.697628

In [46]: df.loc[:,"a":"c"] ## label based column ranges slicing

Out[46]:

a b c

0 0.409038 0.745497 0.890767

1 0.570642 0.181552 0.794599

2 0.568440 0.501638 0.186635

3 0.679125 0.642817 0.697628

In [47]: df.iloc[:, 0:3] ## index based column ranges slicing

Out[47]:

a b c

0 0.409038 0.745497 0.890767

1 0.570642 0.181552 0.794599

2 0.568440 0.501638 0.186635

3 0.679125 0.642817 0.697628

### with 2 different column ranges, index based slicing:

In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]

Out[49]:

a b c

0 0.409038 0.745497 0.890767

1 0.570642 0.181552 0.794599

2 0.568440 0.501638 0.186635

3 0.679125 0.642817 0.697628

请尝试避免仅将代码作为答案转储,并尝试解释其作用和原因。对于没有相关编码经验的人,您的代码可能并不明显。请编辑您的答案以包括说明,上下文,并尝试在答案中提及任何限制,假设或简化。

如果数据框如下所示:

1

2

3

4

5

6

7group name count

fruit apple 90

fruit banana 150

fruit orange 130

vegetable broccoli 80

vegetable kale 70

vegetable lettuce 125

和输出可能像

1

2

3

4group name count

0 fruit apple 90

1 fruit banana 150

2 fruit orange 130

如果您使用逻辑运算符np.logical_not

1df[np.logical_not(df['group'] == 'vegetable')]

更多关于

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html

其他逻辑运算符

logical_and(x1,x2,/ [,out,where,...])计算的真值

x1和x2元素方式。

logical_or(x1,x2,/ [,out,where,cast,

...])按元素计算x1或x2的真值。

logical_not(x,/ [,out,where,cast,...])计算真相

非x元素值。

logical_xor(x1,x2,/ [,out,where,..])按元素计算x1 XOR x2的真值。

相当于

1

2>>> print(df2.loc[140:160,['Relevance','Title']])

>>> print(df2.ix[140:160,[3,7]])

假设您需要所有行,则从DataFrame获取列子集的另一种方法是:

data[['a','b']]和data[['c','d','e']]

如果要使用数字列索引,可以执行以下操作:

data[data.columns[:2]]和data[data.columns[2:]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值