https://pandas.pydata.org/docs/reference/index.html
课程代码: github chendaniely/pandas_for_everyone
import pandas as pd
df = pd.read_csv('../data/xxxx.tsv', sep='\t')
# 头5行数据, 可以设置参数决定多少行
print(df.head())
df.head(n=1)
# 最后5行数据
print(df.tial())
df.tail(n=1)
# df 的类型
print(type(df))
# df 的形状, 行数, 列数
print(df.shape)
# 所有的列名
print(df.columns)
# 每列数据的类型
print(df.dtypes)
# df 的详细信息
print(df.info())
# 显示某一列的数据
df['country']
df.country
df[['country', 'continent', 'year']]
# 第一列
df[[0]]
# 最后一列
df[[-1]]
# 前5列的数据
df[list(range(5))]
# 列号是 3-5 列的数据
df[list(range(3, 6))]
# 列号是 0, 2, 4 列的数据
df[list(range(0, 5, 2))]
# 第一行的数据
df.loc[0]
# 最后一行
df.loc[df.shape[0] - 1]
# 使用行号来提取行
df.iloc[0]
# 行子集
df.ix[0]
# 第 1 行, 99 行, 999行数据
df.loc[[0, 99, 999]]
df.iloc[[0, 99, 999]]
df.ix[[0, 99, 999]]
# 提取行列子集
# 第43与 country 的数据
df.ix[42, 'country']
df.loc[42, 'country']
# 第43与 第一列的数据
df.iloc[42, 0]
# 提取多行, 多列
# 第1行, 100行, 1000行, 第 1, 4, 6 列的数据
df.ix[[0, 99, 999], [0, 3, 5]]
# 使用列名更直观
df.ix[[0, 99, 999], ['country', 'lifeExp', 'gdpPercap']]
数据分析
# 按 yearn 分组, 统计 lifeExp 的平均值
df.groupby('year')['lifeExp'].mean()
# 按 yearn 和 continent 分组, 统计 lifeExp, 'gdpPercap' 的平均值
df.groupby(['year', 'continent'])['lifeExp', 'gdpPercap'].mean()
# 按 continent 分组, 查看所有的 country (去重)
df.groupby('continent')['country'].nunique()
序列对象
s = pd.Series(['banana', 42])
s = pd.Series(['GZ', 'Creator of Pandas'], index=['Person', 'Who'])
scientists = pd.DataFrame({'Name': ['RRR', 'WWW'], 'Occupation': ['CCC', 'SSS'], 'Born': ['1990-01-01', '1980-02-02'], 'Age': [34, 44]})
# 定义行列名称
scientists = pd.DataFrame({'Occupation': ['CCC', 'SSS'], 'Born': ['1990-01-01', '1980-02-02'], 'Age': [34, 44]}, index=['RRR', 'WWW'], columns=['Occupation', 'Born', 'Age'])
# 大于平均值的年龄
ages[ages > ages.mean()]
# 判断每一个年龄是否大于平均值
ages > ages.mean()
# 过滤
manual_bool_values = [True, True, False, False, True, True, False, False]
# 只保留 True 的值
ages[manual_bool_values]
# 每行相加
ages + ages
# 每行相乘, 要同样维度, 否则就 NaN
ages * ages
# 每行加100
ages + 100
# 每行乘以 2
ages * 2
# 头两个可以正常相加, 后面缺失的 NaN
ages + pd.Series([1, 100])
# numpy 如果维度不一样, 会报错
import numpy as np
ages + np.array([1, 100])
数据框
df[df['Age'] > df['Age'].mean()]
# 创建一个副本
df = df.copy()
# 创建一个新列
df['born_dt'] = born_datetime
import random
random.seed(42)
# 打乱 Age 列
random.shuffle(df['Age'])
# 通过两列计算一列, 添加到一个新的列
df['age_days_dt'] = df.dide_dt - df.born_dt
# 把天转换成年
df['age_years_dt'] = df.age_days_dt.astype('timedelta64[Y]')
.pickle
文件是 Python 独有的
# 序列导出到 pickle 文件
names.to_pickle('name_series.pickle')
# 数据框导出到 pickle 文件
df.to_pickle('df.pickle')
series_names_from_pickle = pd.read_pickle('names_series.pickle')
df_from_pickle = pd.read_pickle('df.pickle')
保存到有分割的文件中
names.to_csv('names_series.csy')
names.to_csv('names_series.csy', spe='\t')
df.to_csv('df_series.csy')
序列要保存到 excel, 需要转换成 DataFrame
name_df = names.to_frame()
name_df = to_excel('names_series.xlsx')
df.toexcel('df.xlsx', sheet_name='scientists', index=False)