Series
- 定义
一列索引,一列数据,一共两列。
如果使用字典创建,每一行数据对应字典的一个键值对。
如果使用列表创建,列表内容作为数据,索引从0开始自动生成。
series的列名固定是0,name属性表示整个Series的名字。
- 转datafriame
a) 保留索引
import pandas
series = pandas.Series(
{'语文': 90,
'数学': 92,
'物理': 100,
'化学': 88})
df = pandas.Dataframe(series)
b) 索引和数据变为dataframe的两列数据
df = series.reset_index()
- 修改数据类型
# 方法一
series = series.astype(float)
# 方法二
series = series.map(float)
- 追加数据
# 方法一
series = series.append(
pandas.Series({'政治': 80, '生物': 90}))
# 方法二
series = pandas.concat(
[series,
pandas.Series({'政治': 80, '生物': 90})])
# 方法三
series['政治'] = 80
series['生物'] = 90
Dataframe
- 定义
一列索引,任意列数据。
每一列数据对应字典的一个键值对。
df = pandas.Dataframe(
{'姓名': ['小明', '小刚', '小赵', '小强'],
'性别': ['男', '女', '男', '女'],
'年龄': [18, 17, 15, 16]
})
- 追加数据
# axis = 1表示将两个df水平拼接,默认为竖直拼接
df = pandas.concat([df1, df2], axis = 1)
# 上下限guard
df['age'] = df['age'].clip(0, 100)
- 切片
# 取前5行
df.head(5)
# 取后5行
df.tail(5)
# 采样10行
df.sample(10)
- 统计信息
# 基本信息
df.info()
# 统计信息
df.describe()
# 各个值的个数
df.value_counts()
# 是否包含空值
df.isnull().sum()
# 将空格替换为中位数
median = df['age'][df['age'] != ' '].median()
df.loc[df['age'] == ' ', 'age'] = median
# 最大和最小5个数
df['age'].nlargest(5)
df['age'].nsmallest(5)
# 累加
df['age'].cumsum()
- 与csv的相互转换
# 从csv读取, 默认csv中全是数据
df = pandas.read_csv('data.csv')
# 从csv读取,让csv中第一列变成dateframe的index
df = pandas.read_csv('data.csv', index_col=0)
# 如果想把索引列再变成数据
df.reset_index(inplace=True)
# 读取指定列
df = pandas.read_csv('data.csv', usecols=['time', 'age'])
# 读取指定类型
df = pandas.read_csv('data.csv', datatype={'id': str})
# 替换True,False
df = pandas.read_csv('data.csv', true_values=['对'], false_values=['错'])
# 替换成NaN
df = pandas.read_csv('data.csv', na_values=['不', '否'])
# 指定日期的解析格式
from datetime import datetime
pandas.read_csv('data.csv',
sep="\t",
parse_dates=["date"],
date_parser=lambda x: datetime.strptime(x, "%Y年%m月%d日"))
# 写入csv
df.head(50).to_csv('new_data.csv')
- 修改
# 修改列名
df.columns = [’name', 'gender', 'age']
# 修改列的数据格式
df['date'] = df['date'].astype(float)
df['date'] = pandas.to_datetime(df['date'])
df['year'] = df['date'].dt.year
# 改变列的映射
df['age'] = df['age'].map({'男':1, '女':0})
# 改变列的顺序
df = df[['D', 'C', 'B', 'A']]
# 删除列
df.drop(columns=['age', 'gender'], inplace=True)
# 删除包含NaN的行
df.dropna()
# 填充NaN为0
df.fillna(0)
# 重置索引列
df.reset_index(reset=True)
- 创建日期index
# 创建31个日期格式的index,从'2022-10-9'开始,每个间隔一天
date_range = pandas.date_range(start='2022-10-9', periods=31)
# 创建2022年的所有周一的日期格式的index
date_range = pandas.date_range(start='2022-01-01',
end='2022-12-31',
freq='W-Mon'
)
# 创建2022-10-1中24小时的日期形式的index
date_range = pandas.date_range(start='2022-10-1',
end='2022-10-2',
freq='H',
# closed默认左右都闭,left为左闭右开
closed=left
)
# 判断日期是一年中的哪一天
df['day_of_year'] = df['day'].dt.dayofyear
freq参数:
- 统计函数
df.count() #非空元素计算
df.min() #最小值
df['age'].argmin #第一个最小值的index
df.max() #最大值
df.isnull() #是否为空
df.corr() #相关矩阵
df.idxmin() #最小值的位置,类似于R中的which.min函数
df.idxmax() #最大值的位置,类似于R中的which.max函数
df.quantile(0.1) #10%分位数
df.sum() #求和
df.mean() #均值
df.median() #中位数
df.mode() #众数
df.var() #方差
df.std() #标准差
df.mad() #平均绝对偏差
df.skew() #偏度
df.kurt() #峰度
df.describe() #一次性输出多个描述性统计指标
df.abs() #求绝对值
df.prod #元素乘积
df.cumsum #累计和
df.cumprod #累计乘积
# 求每年的收盘均值
df.groupby('year')['close'].mean()
- 条件筛选
# 筛选年龄在30以下,性别为女的姓名
df.loc[(df['age'] < 30) & (df['gender'] == 0), 'name']
# 将筛选结果新建一列
df['target'] = (df['age'] < 30) & (df['gender'] == 0)
df['target'] = df['target'].map(lambda x: 1 if x else -1)
- numpy统计函数
import numpy
# 正态分布, 中心值为0,方差为1
numpy.random.normal(loc=0, scale=1, size=1000)
# 二项分布,样本数为1,概率为0.2
numpy.random.binomial(n=1, p=0.2, size=1000)
# 均匀分布,上限为1,下限为0
numpy.random.uniform(low=0, high=1, size=1000)
# 20个 0-1 均匀分布
numpy.random.rand(20)
# 20个 标准正态分布
numpy.random.randn(20)