1.pandas是什么?
pandas是基于Numpy创建的Python库,为Python提供了易于使用的数据结构和数据分析工具。
2.如何使用pandas?
2.1 导入pandas库
import pandas as pd
2.2 数据结构
1) Series
series可以理解为是一维数组,series翻译过来是连续的、串联,使用方式如下:
s = pd.Series([1,2,45,5], index=['a','b','c','d'])
index | data |
---|---|
a | 1 |
b | 2 |
c | 45 |
d | 5 |
2) DataFrame
DataFrame是一个二维的数组,使用方式如下:
data = {'姓名':['张三','李四','王五'],
'性别':['男','女','女'],
'年龄':['21','15','18']}
df = pd.DataFrame(data, columns=['姓名','性别','年龄'])
姓名 | 性别 | 年龄 |
---|---|---|
张三 | 1 | 21 |
李四 | 女 | 15 |
王五 | 女 | 18 |
3)表格的操作
- 读取、写入CSV
pd.read_csv('file.csv', header=None, nrows=5)
df.to_csv('myDataFrame.csv')
- 读取、写入EXCEL
pd.read_ecxel('file.xlsx')
pd.to_excel('myDataFrame.xlsx', sheet_name='Sheet1')
# 读取内含多个表格的EXCEL
xlsx = pd.ExcelFile('file.xls')
df = pd.read_excel(xlsx, 'Sheet1')
4)定位元素at,iat,loc,iloc,ix
带i的是索引,不带i的是标签,ix是既可以用标签,也可以用位置
print(df.at['行标签名', '列标签名'])
print(df.iat['行索引号', '列索引号'])
print(df.loc['行标签名', '列标签名'])
print(df.iloc[行索引数字, 列索引数字])
print(df.loc['行标签名1':'行标签名2', '列标签名1': '列标签名2'])
print(df.iloc[行索引数字1:行索引数字2, 列索引数字1:列索引数字2])
print(df.iloc[[行索引数字1,行索引数字2,行索引数字3],[列索引数字1,列索引数字2]])
5)其他常用操作
-
行列操作
# 将行变为列
df_r = df.pivot(index='Date', columns='Type', values='Value')
# 将行变为列 表操作
df_r = pd.pivot_table(df,values='Value', index='Date', columns='Type')
# 融合
pd.melt(df, id_vars=['Date', value_vars=['Type','Value'], value_name=''] )
# 迭代
df.iteritems() 列索引
df.iterrows() 行索引
Date | Type | Value |
---|---|---|
2016-03-01 | a | 12 |
2016-03-03 | b | 12 |
2016-03-05 | c | 5 |
2016-03-09 | a | 45 |
2016-03-19 | b | 9 |
- 索引操作
#设置、取消索引
df.set_index('Country') #设置索引
df2 = df.reset_index() #取消索引
df = df.rename(index=str, columns={'Country':'cntry','Capital':'cptl','Population':'ppltn'}) #重命名DataFrame列名
# 重置索引
s2 = s.reindex(['a','b','c'])
df.reindex(range(4), method='ffill') #前向填充
s3 = s.reindex(range(5), method='bfill') #后向填充
# 基础操作
df.loc[:, (df>1).any()] #选择任一值大于1的列
df.loc[:, (df>1).all()] #选择所有值大于1的列
df.loc[:, df.isnull()).any()] #选择含NaN值的列
df.loc[:, df.notnull()).all()] #选择不含NaN值的列
# 通过isin选择
df[(df.Country.isin(df2.Type))] #选择为某一类型的数值
df.filter(items=["a","b"]) #选择特定值
df.select(lambda x: not x%5) #选择指定元素
# 通过where选择
s.where(s>0) #选择子集
# 通过Query选择
df.query('second > first') #查询DataFrame
# 多重索引
arrays = [np.array([1,2,3]),np.array([5,4,3])]
df = pd.DataFrame(np.random.rand(3,2), index=arrays)
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first','second'])
df2 = pd.DataFrame(np.random.rand(3,2), index=index)
df3.set_index(["Date","Type"])
# 重复数据
s3.unique() #返回唯一值
df.duplicated('Type') #查找重复值
df.drop_duplicates('Type', keep='last') #去除重复值
df.index.duplicated() #查找重复索引
-
数据操作
# 数据分组
df.groupby(by=['Date','Type']).mean()
df.groupby(level=0).sum()
df.groupby(level=0).agg({'a':lambda x:sum(x)/len(x), 'b':np.sum()})
# 缺失值
df.dropna() #去除缺失值NaN
df.fillna(df.mean) #用预设值填充缺失值NaN
df.replace('a', 'f') #用一个值替换另一个值
# 合并操作
pd.merge(data1, data2, how='left', on='X1')
# 连接操作
data1.join(data2, how='right')
# 拼接操作
s.append(s2) # 纵向
# 横向/纵向
pd.concat([s,s2], axis=1, keys=['One', 'Two'])
pd.concat([data1, data2],axis=1, join='inner')
-
日期操作
df['Date'] = pd.to_datetime(df['Date'])
df['Date'] = pd.date_range('2020-01-02', periods=6, freq='M')
dates = [datetime(2012,5,1), datetime(2012,5,3)]
index = pd.DatetimeIndex(dates)
index = pd.date_range(datetime(2012,2,1), end, freq='BM') #BM是指的每个月的最后一个工作日
网友评论