Series
类似于⼀维数组的对象。仅由⼀组数据即可产⽣最简单的Series。主要是Series 的values和index属性获取其数组表示形式和索引对象。NumPy
数组相⽐,你可以通过索引的⽅式选取Series中的单个或⼀组值。在用numpy做操作的时候,可以保留索引值。Series
是索引值到数据值的一个映射,它由⼀组数据(各种NumPy数据类型)以及⼀组与之相关的数据标签(即索引)组成。Series
。修改键值(传入新的index)来改变顺序。isnull
和notnull
来检测缺失数据。(第七章详谈)Series
对象本身及其索引都有⼀个name
属性,该属性跟pandas其他的关键功能关系⾮常密切。index
,我经常碰到的时间序列)列(columns
,我之前一直叫列头)索引head
()选取前五列loc
和iloc
)data = {
'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],\
'year': [2000, 2001, 2002, 2001, 2002, 2003],\
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four','five', 'six'])
frame2['debt'] = np.arange(6.) #赋值直接更改
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2['eastern'] = frame2.state == 'Ohio'#可以学一手,记一下就行,这种操作也不常用啊
del frame2['eastern']#`del`删除列
frame2.columns
pop = {
'Nevada': {
2001: 2.4, 2002: 2.9}, 'Ohio': {
2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)
frame3
frame3.T #转置
values
**将DataFrame转化为np.array,后面就可以进行numpy数组操作了!pandas的索引对象负责管理轴标签和其他元数据(⽐如轴名称等)。Index对象不可变
reindex
。(method=‘ffill’)使⽤ffill可以实现前向值填充。 obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
obj3
obj3.reindex(range(6), method='ffill')
drop
)传递axis=1
或axis
='columns’可以删除列的值在设置相关要求时inplace=True ⼩⼼使⽤inplace,它会销毁所有被删除的数据。
data = pd.DataFrame(np.arange(16).reshape((4, 4)),index=['Ohio', 'Colorado', 'Utah', 'New York'],columns=['one', 'two', 'three','four'])
data[data < 5] = 0#过滤选取值data<5直接是找表中的值小于5
loc[]
和iloc[]
来进行选取 data.loc['Colorado', ['two', 'three']]# 根据行列索引来找值(excel操作)
data.iloc[[1, 2], [3, 0, 1]]#同上类似操作
loc[]
和iloc[]
算术方法 | 说明 |
---|---|
add,radd | 用于加法的操作 |
sub,rsub | 用于减法的操作 |
mul,rmul | 用于乘法的操作 |
div.rdiv | 用于除法的操作 |
pow,rpow | 指数运算 |
df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)),columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)),columns=list('abcde'))
df1.add(df2, fill_value=0)
df1.reindex(columns=df2.columns, fill_value=0) # 关注reindex方法
注意add和reindex都有fill_value这一属性。
#np中array中的广播机制
arr = np.arange(12.).reshape((3, 4))
arr
arr[0]
arr - arr[0]
#——————————————————————————————
#pandas中DataFrame和Series的广播机制
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),
columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.iloc[0]
frame - series
#——————————————————————————————列上广播操作
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),\
columns=list('bde'),\
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.iloc[:,0]
print((frame.T - series).T)
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),\
columns=list('bde'),\
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series=frame.iloc[0]
series3 = frame['d']
print(frame.sub(series, axis='columns'))
print(frame.sub(series3,axis='index'))
arr= pd.Series([1.5, -2.5, 0])
np__ar=arr.values #values就可以实现,然后就可以进行数组运算
#该功能可以在一个数据表中找到一列(columns)中的最大值和最小值。
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),index=['Utah', 'Ohio', 'Texas', 'Oregon'])
f = lambda x: x.max() - x.min()
frame.apply(f)
frame.apply(f, axis='columns')
#该功能实现找到数据表中每一列的最大值和最小值,然后形成一个DataFrame
def f(x):
return pd.Series([x.min(), x.max()], index=['min', 'max'])
frame.apply(f)
#格式化字符串
format = lambda x: '%.2f' % x
frame.applymap(format) #applymap 用于dataframe上,是**元素级别的操作**;
frame['e'].map(format) #map 用于series上,是**元素级别的操作**。
补充:许多常用的数组统计功能都被实现成DataFrame的方法(sum和mean),因此有时候无需使用apply方法
sort_index()
和 sort_values()
#————————————sort_index()的用法
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),\
index=['three', 'one'],\
columns=['d', 'a', 'b', 'c'])
frame.sort_index()
frame.sort_index(axis=1,ascending=False)
#————————————sort_values()的用法
frame = pd.DataFrame({
'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
frame.sort_values(by='b')
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank()
obj.rank(method='first')
obj.rank(ascending=False, method='max') #降序排名
frame = pd.DataFrame({
'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],\
'c': [-2, 5, 8, -2.5]})
frame.rank(axis='columns')
方法(method) | 说明 |
---|---|
min | 使用分组中的最小排名 |
max | 使用分组中的最大排名 |
first | 值在原始数据中的出现顺序分配排名 |
obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
obj.index.is_unique #查看索引是否唯一,返回布尔值
df.mean(axis='columns', skipna=False)
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],\
[np.nan, np.nan], [0.75, -1.3]],\
index=['a', 'b', 'c', 'd'],\
columns=['one', 'two'])
#————————约简型
df.sum()
df.sum(axis='columns')
df.mean(axis='columns', skipna=False)
#————————
df.idxmax() #切分数据表,可以找到每一区域内的最大的数据点(返回的是间接统计(如达到最值的索引))
df.idxmin() #切分数据表,可以找到每一区域内的最小的数据点(返回的是间接统计(如达到最值的索引))
#————————累计型
df.cumsum() #累计值
#————————汇总统计
df.describe() #描述信息
选项 | 说明 |
---|---|
axis | 约简的轴,0代表行,1代表列 |
skipna | 排除缺失值,默认为True |
方法 | 说明 |
---|---|
count | 非NA值的数量 |
describe | 针对Series或各DataFrame列计算汇总统计 |
min,max | 计算最大值和最小值 |
argmin,argmax | 计算获取到最小值和最大值的索引位置(整数) |
idxmin,idxmax | 计算能够获取到最小值和最大值的索引值 |
quantile | 计算样本的分位数(0到1) |
sum | 值的总和 |
mean | 值的平均数 |
median | 值的算术中位数(50%分位数) |
mad | 根据平均值计算平均绝对离差 |
var | 样本值的方差 |
std | 样本值的标准差 |
skew | 样本值的偏度(三阶矩) |
kurt | 样本值的峰度(四阶矩) |
cumsum | 样本值的累计和 |
cummin、cummax | 样本值的累计最大值和累计最小值 |
cumprod | 样本值的累计积 |
diff | 计算一阶差分(对时间序列很有用) |
pct_change | 计算百分数变化 |
其中describe()列举了count、mean、std、min、25%、50%、75%、max等信息。
argmin()是numpy的操作。
price = pd.read_pickle('examples/yahoo_price.pkl')
volume = pd.read_pickle('examples/yahoo_volume.pkl')
returns = price.pct_change()
print(returns.tail())
print(returns['MSFT'].corr(returns['IBM']))
print(returns['MSFT'].cov(returns['IBM']))
print(returns.corr())
print(returns.cov())
print(returns.corrwith(returns.IBM))
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
pd.value_counts(obj.values, sort=False)
print(obj[obj.isin(['b', 'c'])].index)
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
unique_vals=to_match.unique()
print(pd.Index(unique_vals).get_indexer(to_match))
方法 | 说明 |
---|---|
isin | 两series找位置 |
match | 两series找位置,对于数据对齐和连接类型的操作十分有用 |
unique | 按发现顺序返回唯一值数组 |
value_counts | 返回series,索引唯一,值为频率,默认为降序排列(sort可更改) |
data = pd.DataFrame({
'Qu1': [1, 3, 4, 3, 4],\
'Qu2': [2, 3, np.nan, 2, 7],\
'Qu3': [1, 5, 2, 4, 4]})
result = data.apply(pd.value_counts).fillna(0)