基础运算
Series
#1通过一维数组创建序列
arr1 = np.arange(10) #numpy.ndarray
s1 = pd.Series(arr1) #pandas.core.series.Series
#2通过字典的方式创建序列
dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50} #dict
s2 = pd.Series(dic1) #pandas.core.series.Series
DataFrame
arr1 = np.arange(10) #numpy.ndarray
s1 = pd.Series(arr1) #pandas.core.series.Series
dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50} #dict
s2 = pd.Series(dic1) #pandas.core.series.Series
dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},
'two':{'a':5,'b':6,'c':7,'d':8},
'three':{'a':9,'b':10,'c':11,'d':12}}#dict
df3 = pd.DataFrame(dic3) #pandas.core.frame.DataFrame
df2 = df3[['one']] #pandas.core.frame.DataFrame
'''
df4
one
a 1
b 2
c 3
d 4
'''
属性
print(df2)
print(df2.dtypes)
print(df2.index)
print(df2.columns)
print(df2.values)
print(df2.describe())
复杂运算
选择数据
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),
index=dates, columns=['A','B','C','D'])
A B C D
2013-01-01 0 1 2 3
2013-01-02 4 5 6 7
2013-01-03 8 9 10 11
2013-01-04 12 13 14 15
2013-01-05 16 17 18 19
2013-01-06 20 21 22 23
多行或多列df[0:3]
根据标签 loc选择行或者列的数据df.loc['20130102',['A','B']]
根据序列 iloc,用位置进行选择
混合的这两种 ix,df.ix[:3,['A','C']]
通过判断的筛选,print(df[df.A>8])
设置值
利用索引或者标签确定需要修改值的位置
df.iloc[2,2] = 1111
df.loc['20130101','B'] = 2222
根据条件设置
df.B[df.A>4] = 0
处理丢失数据
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),
index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
A B C D
2013-01-01 0 NaN 2.0 3
2013-01-02 4 5.0 NaN 7
2013-01-03 8 9.0 10.0 11
2013-01-04 12 13.0 14.0 15
2013-01-05 16 17.0 18.0 19
2013-01-06 20 21.0 22.0 23
直接去掉有 NaN 的行或列, 可以使用 dropna
df.dropna(
axis=0, # 0: 对行进行操作; 1: 对列进行操作
how='any' # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop
)
将 NaN 的值用其他值代替,比如0;df.fillna(value=0)
判断是否有缺失数据 NaN, 为 True 表示缺失数据;df.isnull()
导入导出
pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等
import pandas as pd #加载模块
#读取csv
data = pd.read_csv('student.csv')
将资料存取成pickle;data.to_pickle('student.pickle')
合并concat
#定义数据
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
#concat纵向合并,下面这两张注意行序号的变化!!
res = pd.concat([df1, df2, df3], axis=0)
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
join='outer'为预设值,因此未设定任何参数时,函数默认join='outer'。
此方式是依照column来做纵向合并,有相同的column上下合并在一起,
其他独自的column个自成列,原本没有值的位置皆以NaN填充。
#纵向"外"合并df1与df2,扩大了
res = pd.concat([df1, df2], axis=0, join='outer')
#纵向"内"合并df1与df2,缩小了
res = pd.concat([df1, df2], axis=0, join='inner')
join_axes (依照 axes 合并)
#依照`df1.index`进行横向合并
res = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
append只有纵向合并,没有横向合并。
合并 merge
pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据.
通常也被用在Database的处理当中.
#定义资料集并打印出
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
#依据key column合并,并打印出
res = pd.merge(left, right, on='key')
#依据key1与key2 columns进行合并,并打印出四种结果['left', 'right', 'outer', 'inner']
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
indicator=True会将合并的记录放在新的一列
# 依据col1进行合并,并启用indicator=True,最后打印出
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
# 自定indicator column的名称,并打印出
res = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
#定义资料集
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
#使用suffixes解决overlapping的问题
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
依据index合并
#定义资料集并打印出
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
#依据左右资料集的index进行合并,how='outer',并打印出
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
#依据左右资料集的index进行合并,how='inner',并打印出
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
参考
Python数据分析之pandas学习
莫烦python教程
https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/3-1-pd-intro/
数据科学入门篇3:数据处理利器Pandas使用手册
https://zhuanlan.zhihu.com/p/25184830