python_pandas_dataframe_行列选择_切片操作

来源:互联网 发布:java给qq邮箱发邮件 编辑:程序博客网 时间:2024/06/01 08:20

SQL中的select是根据列的名称来选取;Pandas则更为灵活,不但可根据列名称选取,还可以根据列所在的position(数字,在第几行第几列,注意pandas行列的position是从0开始)选取。相关函数如下:
1)loc,基于列label,可选取特定行(根据行index);
2)iloc,基于行/列的position;
3)at,根据指定行index及列label,快速定位DataFrame的元素;
4)iat,与at类似,不同的是根据position来定位的;
5)ix,为loc与iloc的混合体,既支持label也支持position;

实例

import pandas as pdimport numpy as npdf = pd.DataFrame({'total_bill': [16.99, 10.34, 23.68, 23.68, 24.59],                   'tip': [1.01, 1.66, 3.50, 3.31, 3.61],                   'sex': ['Female', 'Male', 'Male', 'Male', 'Female']})# data type of columnsprint df.dtypes# indexesprint df.index# return pandas.Indexprint df.columns# each row, return array[array]print df.valuesprint df
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
sex            objecttip           float64total_bill    float64dtype: objectRangeIndex(start=0, stop=5, step=1)Index([u'sex', u'tip', u'total_bill'], dtype='object')[['Female' 1.01 16.99] ['Male' 1.66 10.34] ['Male' 3.5 23.68] ['Male' 3.31 23.68] ['Female' 3.61 24.59]]      sex   tip  total_bill0  Female  1.01       16.991    Male  1.66       10.342    Male  3.50       23.683    Male  3.31       23.684  Female  3.61       24.59
print df.loc[1:3, ['total_bill', 'tip']]print df.loc[1:3, 'tip': 'total_bill']print df.iloc[1:3, [1, 2]]print df.iloc[1:3, 1: 3]
  • 1
  • 2
  • 3
  • 4
   total_bill   tip1       10.34  1.662       23.68  3.503       23.68  3.31    tip  total_bill1  1.66       10.342  3.50       23.683  3.31       23.68    tip  total_bill1  1.66       10.342  3.50       23.68    tip  total_bill1  1.66       10.342  3.50       23.68

错误的表示:

print df.loc[1:3, [2, 3]]#.loc仅支持列名操作
  • 1
KeyError: 'None of [[2, 3]] are in the [columns]'
print df.loc[[2, 3]]#.loc可以不加列名,则是行选择
  • 1
    sex   tip  total_bill2  Male  3.50       23.683  Male  3.31       23.68
print df.iloc[1:3]#.iloc可以不加第几列,则是行选择
  • 1
    sex   tip  total_bill1  Male  1.66       10.342  Male  3.50       23.68
print df.iloc[1:3, 'tip': 'total_bill']
  • 1
TypeError: cannot do slice indexing on <class 'pandas.indexes.base.Index'> with these indexers [tip] of <type 'str'>
print df.at[3, 'tip']print df.iat[3, 1]print df.ix[1:3, [1, 2]]print df.ix[1:3, ['total_bill', 'tip']]
  • 1
  • 2
  • 3
  • 4
3.313.31    tip  total_bill1  1.66       10.342  3.50       23.683  3.31       23.68   total_bill   tip1       10.34  1.662       23.68  3.503       23.68  3.31
print df.ix[[1, 2]]#行选择
  • 1
    sex   tip  total_bill1  Male  1.66       10.342  Male  3.50       23.68
print df[1: 3]print df[['total_bill', 'tip']]# print df[1:2, ['total_bill', 'tip']]  # TypeError: unhashable type
  • 1
  • 2
  • 3
    sex   tip  total_bill1  Male  1.66       10.342  Male  3.50       23.68   total_bill   tip0       16.99  1.011       10.34  1.662       23.68  3.503       23.68  3.314       24.59  3.61
print df[1:3,1:2]
  • 1
TypeError: unhashable type

总结

1).loc,.iloc,.ix,只加第一个参数如.loc([1,2]),.iloc([2:3]),.ix[2]…则进行的是行选择
2).loc,.at,选列是只能是列名,不能是position
3).iloc,.iat,选列是只能是position,不能是列名
4)df[]只能进行行选择,或列选择,不能同时进行列选择,列选择只能是列名。

原创粉丝点击