import pandas as pd
# Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
1. Series 构造
1.1 普通构造
pd.Series(data 一组数据,
index 索引标签 默认为0开始,
dtype 数据类型-默认自行判断,
name 设置名称,
copy 拷贝数据-默认为False)
1.2 使用kv对,类似字典来创建Series
dist = {1: "A", 2: "B", 3:"C"}
myvar = pd.Series(dist)
# 如果只需要一部分数据,根据索引导入即可
myvar = pd.Series(dist, index = [1, 2])
2. 索引
2.1 指定索引值
data = ["A", "B", "C"]
myvar = pd.Series(data, index=["x", "y", "z"])
2.2 根据索引值读取数据
myvar["y"]
# DataFrame
===========================================================================
1. 生成数据表
1.1 导入csv或xlsx文件
df = pd.DataFrame(pd.read_csv('name.csv', header = 1)) # 保留表头
df = pd.DataFrame(pd.read_excel('name.xlsx'))
方法2:
from collections import namedtuple
Item = namedtuple('Item', 'reply pv')
items = []
with codecs.open('reply.pv.07', 'r', 'utf-8') as f:
for line in f:
line_split = line.strip().split('\t)
items.append(Item(line_split[0].strip(), line_split[1].strip()))
# strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
df = pd.DataFrame.from_records(items, columns=['reply', 'pv'])
1.2 用pandas创建数据表
df = pd.DataFrame({
"id":[1001,1002,1003,1004,1005,1006],
"date":pd.date_range('20130102', periods=6),
"city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age":[23,44,54,32,34,32],
"category":['100-A','100-B','110-A','110-C','210-A','130-F'],
"price":[1200,np.nan,2133,5433,np.nan,4432]
},
columns =['id','date','city','category','age','price'])
===========================================================================
2. 数据表信息查看
2.1 查看维度
df.shape
2.2 查看基本信息:维度、列名、数据格式、所占空间
df.info()
2.3 每一列数据的格式
df.dtypes # data types
2.4 某一列格式
df['B'].dtype #data type
2.5 空值
df.isnull()
df['B'].isnull()
df.isnull().count()
2.6 查看某一列的唯一值
df.unique()
2.7 查看数据表的值
df.values
2.8 查看列名称
df.columns
2.9 查看前五行、后五行数据
df.head()
df.tail()
===========================================================================
3. 数据表清洗
df.fillna(value = 0) # 用0填充空值
df['price'].fillna(df['price'].mean()) # 使用price列的均值对na进行填充
df['city'] = df['city'].map(str.strip) # 清除city字段的字符空格
df['city'] = df['city'].str.lower() # 大小写转换
df['price'].astype('int') # 更改数据格式
df.rename(columns = {'date': 'datetime'}) # 更改列名称
df['city'].drop_duplicates() # 删除后出现的重复值
df['city'].drop_duplicates(keep = 'last') # 删除先出现的重复值
df['city'].replace('sh', 'shanghai') # 数据替换
===========================================================================
4. 数据预处理
df1=pd.DataFrame({
"id":[1001,1002,1003,1004,1005,1006,1007,1008],
"gender":['male','female','male','female','male','female','male','female'],
"pay":['Y','N','Y','Y','N','Y','N','Y',],
"m-point":[10,12,20,40,40,40,30,20]})
df_inner = pd.merge(df, df1, how = 'inner') # 匹配合并 交集
df_left = pd.merge(df, df1, how = 'left') # left join
df_right = pd.merge(df, df1, how = 'right') # right join
df_outer = pd.merge(df, df1, how = 'outer') # 并集
result1 = df1.append(df2) # 把df2接到df1后面
result = left.join(right, on = 'key') # 左表以key为主键,left join右表
pd.concat(
objs, # 一个series、df、disc对象的映射
axis = 0, # 默认值为0,往下接, 1则往右接
join_axes = None, # {'outer', 'inner'},默认外接
ignore_index = False, # 默认False, True代表不要串联轴上使用的索引值
...
)
frames = [df1, df2, df3]
result = pd.concat(frames)
df.set_index('id') # 设定索引列
df.sort_values(by=['age']) # 按指定的列的值排序
df.sort_index() # 按照索引列排序
df.['group'] = np.where(df['price']>2000, 'high', 'low') # 如果price的值>2000,group列显示high,否则显示low
df.loc[(df['city'] == 'beijing') & (df['price'] >= 4000), 'sign'] = 1 # 对符合多个条件的数据进行标记
split = pd.DataFrame((x.split('-') for x in df['category']), index=df.index, columns = ['category', 'size'])
# 对category字段的值依次进行分列,并创建数据表,索引值为df的索引列,列名称为category和size
# "category":['100-A','100-B','110-A','110-C','210-A','130-F'],
df = pd.merge(df, split, right_index = True, left_index = True) # 将分裂后的数据表于原df匹配
===========================================================================
5. 数据提取
loc iloc ix
df.loc[3] # 按索引提取单行的值
df.iloc[0:5] # 按索引提取区域行数值
df.reset_index # 重设索引
df = df.set_index('date') # 设置日期为索引
df[:'2013-01-04'] # 提取改日期前的所有数据
df.iloc[:3, :2] # 按位置区域提取数据
df.iloc[[0,2,5], [4,5]] # 按位置单独提取数据:提取第0、2、5行,4、5列
df.ix[:'2013-01-04', :4] # ix 按索引标签+位置提取数据:2013-01-04号之前,前四列数据
df['city'].isin(['beijing']) # 判断city列是否为beijing
df.loc[df['city'].isin(['beijing', 'shanghai'])] # 判断city列中是否包含beijing和shanghai,将符合条件的数据提取出来
pd.DataFrame(category.str[:3]) # 提取前三个字符,并生成数据表
===========================================================================
6. 数据筛选
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
df.loc[(与 或 非条件), [列1, 列2]]
df.loc[(df['city']!='beijing' & df['price'] >= 200), ['id','city','age','category','gender']].sort(['id']]
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count() # 对筛选后的数据按city列计数
df.query('city == ["beijing", "shanghai"]')
df.query('city == ["beijing", "shanghai"]').price.sum() # 对筛选后的结果按price求和
===========================================================================
7. 数据汇总
df.groupby('city').count() # 对所有的列进行计数汇总
df.groupby('city')['id'].count() # 按城市对id字段计数
df.groupby(['city', 'size'])['id'].count() # 对两个字段进行汇总计数
df.groupby('city')['price'].agg([len, np.sum, np.mean]) # 按city进行汇总,分别计算price的合计和均值
===========================================================================
8. 数据统计
df.sample(n=3) # 简单的数据采样,采n个样
weights = [0,0,0,0,0.4,0.6]
df.sample(n=200, weights = weights) # 手动设置采样权重
df.sample(n=4, replace = False) # 采样后不放回
df.sample(n=5, replace = True) # 采样后放回
df.describe().round(2).T # 数据表描述性统计,round函数设置显示小数位,T表示转置
df['price'].std() # 计算列的标准差
df['price'].cov[df['m-point']] # 计算两个列之间的协方差
df.cov() # 计算数据表中所有字段之间的协方差
df['price'].corr(df['m-point']) # 两个字段的相关性分析,相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
df.corr() # 数据表的相关性分析
===========================================================================
df.to_excel('test.xlsx', sheet_name = 'abc')
df.to_csv('test2.csv')
版权声明:本文为CherryChenieth原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。