Python学习记录(8)——series、dataframe基本操作

Reindexing(重新索引)

  • 重新索引可以按照指定的索引顺序排列数据,如果没有该索引则显示为NaN

例:

obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])

a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
  • 处理时间序列这样的数据时,我们可能需要在reindexing的时候需要修改值。method选项能做到这一点,比如设定method为ffill:
obj3 = pd.Series(['bule', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6), method='ffill')   

0      bule
1      bule
2    purple
3    purple
4    yellow
5    yellow
dtype: object

注:bfill向后填充,ffill向前填充

总结:

  1. 更改行索引
    语法:
数据框名.reindex(索引数组,method)
  1. 更改列索引
    语法:
数据框名.reindex(columns=索引数组,method)
  1. 使用loc更改索引,可以同时更改行和列索引
frame.loc[行索引,列索引]

列名重命名

  1. df.columns = new_columns
    一次性对所有列名重命名,new_coumns 可以是列表或元组, 但新旧列名的长度必须一致
  2. df = df.rename(columns=dict)
    dict是字典,key为旧列名,value为新列名;这种方法可以只改部分列名

按轴删除记录

  • drop可以不返回一个新的object,而是直接更改series or dataframe in-place,此时在函数内部设置参数inplace=True即可

Series

对于series,drop会返回一个新的object,并删去指定的axis的值

obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
new_obj = obj.drop('c')
#若要删除多个,则可以将索引写在数组里

a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64

Dataframe

对于DataFrame,能按行或列的axis来删除
语法:

#按照行删除
数据框名.drop(单个label|label序列)

#按照列删除
数据框名.drop(单个label|label序列, axis=1|axis='columns')

例:直接删除表中第二,四列数据

data = pd.DataFrame(np.arange(16).reshape(4, 4),
                    index=['Ohio', 'Colorado', 'Utah', 'New York'],
                    columns=['one', 'two', 'three', 'four'])
data.drop(['two', 'four'], axis='columns', inplace=True)

索引

series切片

与python比较:

  1. 相同点
    series不仅可以用python的方式——即整数,还可以用定义的label,调取切片,使用方法照旧

例:提取第二个元素

obj['b']
obj[1]

例:提取大于2 的元素

obj[obj >2]
  1. 不同点
    用label来slicing(切片)的时候,和python的切片不一样的在于,会包括尾节点(python前闭后开)

Dataframe切片

  • dataframe的indexing可以是布尔数组:
data[data['three'] > 5]
#筛选出第三列元素大于5的数据
  • boolean dataframe:
data<5
#可以得到一个逻辑值数据框
data[data < 5] = 0
#可以将所有小于5的数据变成0
  • 如果要选择行,则直接填入一组数,若要选择列则传入一个list
data[:2]
#选择前两行
data[[:2]]
#选择前两列
  • indexing可以通过一个值或序列,选中一个以上的列
data[['three', 'one']]
#选择第三、一列

loc和iloc

loc and iloc是种特别的索引符. 这两个方法能通过axis labels(loc)或integer(iloc),来选择行或列,用法和上面一样;除此之外还可以同时筛选行和列

  1. loc
    例:
data

	      one two three four
Ohio	    0   0   0   0
Colorado 	0	5	6	7
Utah	    8	9	10	11
New York	12	13	14	15
data.loc['Colorado', ['two', 'three']]

two      5
three    6
Name: Colorado, dtype: int32
  1. iloc
data.iloc[2, [3, 0, 1]]

four    11
one      8
two      9
Name: Utah, dtype: int32
  1. 切片
    用法和一般切片是一样的,但是注意:loc包含结尾,iloc不包含结尾,即前者闭区间,后者前闭后开
    例:
data.loc[:'Utah', 'two'] 
data.iloc[:, :3][data.three > 5] #在选出前三列(0,1,2)的基础上,筛选第三列值大于5的行

整数索引的注意事项

  • 因为series和dataframe都自带labels(index),如果不做额外设定,则默认整数索引。此时,当我们类似python中使用-1表示最后一个元素时,则会产生歧义,使得程序报错:
ser = pd.Series(np.arange(3.))
ser

0    0.0
1    1.0
2    2.0
dtype: float64
ser[-1] #报错

所以若要避免这类问题最好用非整数做索引,避免歧义。

  • 如果axis index里包含integer,那么选择数据的时候,就会是label-orented. 为了更精确地选择,使用loc(for label)或ilco(for integers)

算术和数据对齐

数据对齐

不同index的obejct之间的算术计算。如果两个object相加,但他们各自的index并不相同,最后结果得到的index是这两个index的合集:即index相同的照常进行计算,不同的就看做值+NaN=NaN
例:

s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
s1+s2

a    9.4
c    1.1
d    NaN
e    0.0
f    NaN
g    NaN
dtype: float64
  • 上述数据对齐规则在series中仅表现为index上,dataframe中则要求行和列要同时保持对齐
  • 这种数据对齐方式会引入很多缺失数据

算术

  1. 加法:add代替+,可以在算术后增加填充功能,将NaN填充为想要的值
    语法:数据框名.add(数据框名2, fill_value=值)
  2. 除法:k/数据框 或 数据框.rdiv(k)
  3. 普通的加减乘除均会

DataFrame和Series之间的操作(broadcasting)

  • broadcasting down the rows(向下按行广播)
    例:
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),
                     columns=list('bde'),
                    index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.iloc[0]

frame - series

     	b	d	e
Utah	0.0	0.0	0.0
Ohio	3.0	3.0	3.0
Texas	6.0	6.0	6.0
Oregon	9.0	9.0	9.0

上述算术中,series的列与frame的列相匹配,从而计算结果是frame的每一行都减了一次series

  • broadcasting down the columns(向下按列广播)
    若要按列广播则必须使用算术方法即:使用sub并且参数axis=0或axis=‘index’
series1 = frame['d']
frame.sub(series1, axis='index')
  • 注意,当出现index不完全匹配时,依旧会出现上述所提的数据对齐问题

你可能感兴趣的:(Python学习记录,python,学习,数据挖掘)