Series数据增删改查、追加、重新索引、对齐(相加)、重新索引
任何数据类型都必须具备增删改查的操作,否则就无法对数据进行运算。本文讲解Series数据的增删改查、重新索引、对齐操作。
1、增加元素
1、直接设置一个key来添加元素
2、append()函数,返回新的Series,参数必须是Series or list/tuple of Series(多个Series组成的列表)
# -*- coding: utf-8 -*- import pandas as pd import numpy as np # 添加元素 s = pd.Series([1,2],index=['a','b']) s['c'] = '不错' # 添加个索引 print(s) print('---------------') # append方式添加元素 s2 = pd.Series([11,22],index=['a','b']) s = s2.append(s2) # 追加一个Series print(s)
a 1 b 2 c 不错 dtype: object --------------- a 11 b 22 a 11 b 22 dtype: int64
2、删除元素
drop()函数,参数可以是单个索引,也可以是多个索引(列表),inplace参数默认False,返回新的Series。inplace为True则修改原来的Series。
# -*- coding: utf-8 -*- import pandas as pd import numpy as np # 删除操作 arr = np.random.rand(3) s = pd.Series(arr,index=['a','b','c']) res = s.drop('a') #删除单个元素 print(res) print('-----------') s2 = pd.Series(arr) res = s2.drop([0,1]) #删除多个元素 print(res) print('-----------') s3 = pd.Series(arr) s3.drop([0,1],inplace=True) #删除多个元素 print(s3)
b 0.185835 c 0.740068 dtype: float64 ----------- 2 0.740068 dtype: float64 ----------- 2 0.740068 dtype: float64
3、更改元素
1、直接通过索引改
直接更改索引值是没问题的,如果进行一轮筛选从中选取目标数据再进行更改则对原Series是不成效的(在dataframe里面这种操作会报警告),具体看下面的代码。
2、通过apply函数更改
Series.apply(func, convert_dtype=True, args=(), **kwds),func为函数名,args是func的位置参数,**kwds为func的关键字参数。
# -*- coding: utf-8 -*- import pandas as pd import numpy as np # 通过索引更改元素 arr = np.random.rand(3) s = pd.Series(arr,index=list('abc')) s['a'] = 100 #修改为100 print(s) # 标签a的值为100 s[s>99]['a']=1 #这个更改对s不生效 print(s) # s没有变化 print('============') res = s[s>99] #单独拿来作为1个Series res['a']= 1 print(res)
a 100.000000 b 0.892186 c 0.287931 dtype: float64 a 100.000000 b 0.892186 c 0.287931 dtype: float64 ============ a 1.0 dtype: float64
# -*- coding: utf-8 -*- import pandas as pd import numpy as np # 通过apply函数更改元素 arr = np.random.rand(3) s = pd.Series(arr,index=['a','b','c']) s_new = s.apply(lambda x:x+10) print(s_new) def add(i): i = i + 10 return i s_new = s.apply(add) print(s_new)
a 10.058797 b 10.399459 c 10.245513 dtype: float64 a 10.058797 b 10.399459 c 10.245513 dtype: float64
# -*- coding: utf-8 -*- import pandas as pd import numpy as np # args参数 arr = np.random.rand(3) s = pd.Series(arr,index=['a','b','c']) def add(i,num): i = i + num return i s_new = s.apply(add,args=(10,)) print(s_new) # kargs参数 def add2(i,**kargs): for num in kargs.values(): i += num return i s_new = s.apply(add2,num1=10,num2=20) print(s_new)
a 10.324784 b 10.005687 c 10.747990 dtype: float64 a 30.324784 b 30.005687 c 30.747990 dtype: float64
4、查看元素
1、head() 默认前5条数据,可以设置参数显示几条。
2、tail() 默认后5条数据,可以设置参数显示几条。
import pandas as pd import numpy as np arr = np.random.rand(2) s = pd.Series(arr,index=['a','b']) print(s) print('---------') print(s.head(1)) print('----------') print(s.tail(1))
a 0.989174 b 0.474133 dtype: float64 --------- a 0.989174 dtype: float64 ---------- b 0.474133 dtype: float64
5、重新索引
不是修改索引名,而是按照新的索引排序生成新Series。
1、reindex()函数实现,返回新的Series,如果新索引和旧索引有重复则会保留原有的索引及对应的值。
2、通过fill_value参数填充缺失值。
import pandas as pd import numpy as np # 重新索引 d = {'a': 1, 'b': 2, 'c': 3} s = pd.Series(d, index=['a', 'b', 'c', 'd']) print(s) print('------------') s1 = s.reindex(['a','b','aa','bb']) print(s1) print('------------') s2 = s1.reindex(['a','b','cc','dd'],fill_value='哈哈') print(s2)
a 1.0 b 2.0 c 3.0 d NaN dtype: float64 ------------ a 1.0 b 2.0 aa NaN bb NaN dtype: float64 ------------ a 1 b 2 cc 哈哈 dd 哈哈 dtype: object
6、对齐操作
1、两个Series求和(相当于add函数),索引相同的会自动相加。
2、2个Series求和时,如果某Series的index参数的值(索引值)有两个相同的,也可以照常参与相加(但是创建Series时应避免出现相同的索引)。
import pandas as pd import numpy as np # 对齐操作 arr = [10,20] s = pd.Series(arr,index=['a','b']) print(s) print('----------------') s2 = pd.Series(arr,index=['a','c']) print(s2) print('=================') print(s + s2) print('----------------') s3 = pd.Series(arr,index=['a','a']) # 索引值相同 print(s3) print('================') print(s + s3)
a 10 b 20 dtype: int64 ---------------- a 10 c 20 dtype: int64 ================= a 20.0 b NaN c NaN dtype: float64 ---------------- a 10 a 20 dtype: int64 ================ a 20.0 a 30.0 b NaN dtype: float64