pandas学习笔记

Panda学习笔记

panda简介

基本数据类型

Series

Series 是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。调用 pd.Series 函数即可创建 Series:

import pandas as pd
import numpy as np
import matplotlib as plt
s0
s0=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s0)
a   -0.139644
b   -1.202701
c    1.199897
d   -0.106429
e   -1.464700
dtype: float64

data 支持以下数据类型:Python 字典、多维数组、标量值。

可用字典直接创建Series

d = {'b': 1, 'a': 0, 'c': 2}
pd.Series(d)

DataFrame

DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:

  • 一维 ndarray、列表、字典、Series 字典
  • 二维 numpy.ndarray
s0=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
d = {'b': 1, 'a': 0, 'c': 2}
s1=pd.Series(d)
D={'one':s0,'two':s1}
pd.DataFrame(D)
one	two
a	-0.759546	0.0
b	0.257484	1.0
c	-0.371518	2.0
d	-1.422805	NaN
e	-1.169984	NaN
pd.DataFrame(D, index=['d', 'b', 'a'], columns=['one', 'two'])
one	two
d	-1.422805	NaN
b	0.257484	1.0
a	-0.759546	0.0
data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
print(data)
data[:] = [(1, 2., 'Hello'), (2, 3., "World")]
[(0, 0., b'') (0, 0., b'')]
pd.DataFrame(data)
A	B	C
0	1	2.0	b'Hello'
1	2	3.0	b'World'

多种方式创建

df2 = pd.DataFrame({'A': 1.,
                    'B': pd.Timestamp('20130102'),
                    'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                    'D': np.array([3] * 4, dtype='int32'),
                    'E': pd.Categorical(["test", "train", "test", "train"]),
                    'F': 'foo'})
df2

A	B	C	D	E	F
0	1.0	2013-01-02	1.0	3	test	foo
1	1.0	2013-01-02	1.0	3	train	foo
2	1.0	2013-01-02	1.0	3	test	foo
3	1.0	2013-01-02	1.0	3	train	foo

提取、添加、删除行(列)

DataFrame 就像带索引的 Series 字典,提取、设置、删除列的操作与字典类似:

索引

data=[{'b': 1, 'a': 0, 'c': 2},{'b': 4, 'a': 7, 'c': 9}]
pddata=pd.DataFrame(data,index=['one','two'])
pddata

b	a	c
one	1	0	2
two	4	7	9

#索引
pddata['a']
pddata[0:2]
pddata['one':'two']['a']
one    0
two    7
Name: a, dtype: int64
b	a	c
one	1	0	2
two	4	7	9
one    0
two    7
Name: a, dtype: int64

#按列索引
pddata['a']
pddata[0:2]
pddata['one':'two']['a']

#按照行索引
df2.loc[0]
pddata.loc['one':'two']

#选择列
df2['A']
df2[['A','B']]

#混合索引
df2.loc[:, ['A', 'B']]
#按轴索引
df2.iloc[3:5, 0:2]
#条件索引,可以多条件索引
df2[df2.E =='test']

追加

#追加行
s=pd.Series({'A': 1.,
             'B': pd.Timestamp('20130102'),
             'C': 1.0,
             'D': 3,
             'E': "test",
             'F': 'foo'})
df2.append(s, ignore_index=True)

#追加列
df2.insert(1,'G',df2['A'])
#对于标量值,可以以广播形式追加
df2['H']='yes'
df2

删除

关于删除,这里有个帖子记录得比较全面:pandas删除

统计运算

分组

在pandas中提供了一个非常好的分组功能,能够将整个df按照某列的信息进行分组:分组

对于此df,可按照标签E的分类来进行分组:

	A	B	C	D	E	F
0	1.0	2013-01-02	2.0	0	test	foo
1	1.0	2013-01-02	2.0	1	train	foo
2	1.0	2013-01-02	2.0	2	?	    foo
3	1.0	2013-01-02	2.0	3	train	foo

#分组
data=origin_data.copy()
group_data=data.groupby(['E'])
#获取分组
print(group_data.get_group('train'))

#也可以直接获取统计量
group_data.sum()
group_data.count()


     A          B    C  D      E    F
1  1.0 2013-01-02  2.0  1  train  foo
3  1.0 2013-01-02  2.0  3  train  foo

		A	B	C	D	F
E					
?		1	1	1	1	1
test	1	1	1	1	1
train	2	2	2	2	2

异常值处理

字符串

在处理数据的过程中,难免需要对字符串进行处理,去除一些冗余信息,提取关键信息。可利用Series内置的str方法:contains,replace等等。

这段数据在cloumns=E的列中包含(注意,这里是包含就可以了,replace是需要全等)了一个?号,这是不希望发生的,一半会进行替换或者删除,首先是要找到它。

origin_data= pd.DataFrame({'A': 1.,
                    'B': pd.Timestamp('20130102'),
                    'C': pd.Series(2, index=list(range(4)), dtype='float32'),
                    'D': np.array([3] * 4, dtype='int32'),
                    'E': pd.Categorical(["test", "train", "?", "train"]),
                    'F': 'foo'})
origin_data


A	B	C	D	E	F
0	1.0	2013-01-02	2.0	3	test	foo
1	1.0	2013-01-02	2.0	3	train	foo
2	1.0	2013-01-02	2.0	3	?	foo
3	1.0	2013-01-02	2.0	3	train	foo


#筛选出中间的?的
#方式1 粗暴的正则表达式法
data=origin_data.copy()
bool=data['E'].str.contains('\?')  #这里填正则表达式
bool
index=data['E'][bool].index
data[bool]
#或者是删除这一行
data[~bool]

	A	B	C	D	E	F
0	1.0	2013-01-02	2.0	3	test	foo
1	1.0	2013-01-02	2.0	3	train	foo
3	1.0	2013-01-02	2.0	3	train	foo

或者是对于有些值,我们需要找到感兴趣的,比如包含Mr,包含其余字符串的。就可以用此方法。

空值处理

删除空值,其中对于dataframe,axis=1指的是横轴,与numpy的轴有区别

origin_data = origin_data[~(origin_data.isnull()).any(axis=1)]

筛选

非数字型筛选

origin_data= pd.DataFrame({'A': 1.,
                    'B': pd.Timestamp('20130102'),
                    'C': pd.Series(2, index=list(range(4)), dtype='float32'),
                    'D': np.array([3] * 4, dtype='int32'),
                    'E': pd.Categorical(["test", "train", "?", "train"]),
                    'F': 'foo'})
origin_data

#删除?的值
data=origin_data.copy()
data=data.replace('?',np.nan)
data.dropna(how='any',inplace=True)
data


A	B	C	D	E	F
0	1.0	2013-01-02	2.0	3	test	foo
1	1.0	2013-01-02	2.0	3	train	foo
3	1.0	2013-01-02	2.0	3	train	foo

#筛选出非数字型的columns,这对于继续一些非连续特征的处理非常关键
unumberic_data=set(data.columns) - set(data.describe().columns)
unumberic_data

{'B', 'E', 'F'}

其余类型筛选

#选择某个特别数据类型的列出来
data=origin_data.copy()
data.dtypes

A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object
#选出类型['category','float']
data.select_dtypes(['category','float'])

A	E
0	1.0	test
1	1.0	train
2	1.0	?
3	1.0	train
#选出除了['category','float']以外的类型
data.select_dtypes(exclude=['category','float'])


			B	C	D	F
0	2013-01-02	2.0	0	foo
1	2013-01-02	2.0	1	foo
2	2013-01-02	2.0	2	foo
3	2013-01-02	2.0	3	foo
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值