本人依据上课学习内容,将dataframe内容浓缩为代码块,一下是今天学习的第一部分:
1.dataframe创建
2.dataframe索引
3.dataframe数据访问(重要)
4.dataframe数据编辑
5.pandas数据读写
6.dataframe统计描述
本文于2021/12/11首发于csdn,如有错误和不足请指出。
----更新记录----
2021/12/13更新了数据编辑的drop函数的axis问题例子;更新了数据访问布尔索引的例子;想要原地操作的话,设置inplace = True即可。
2021/12/21解决了“如何表示多重条件的布尔索引”的问题;修正了关于pd.read_csv函数中header的解释。
import pandas as pd
import numpy as np
# series较为简单,这里不做介绍
'''1.dataframe创建'''
# 创建方式1:字典,key做列名(如果这个是series,key会变成行标签)
data1 = {'name': ['张三', '李四', '王五', '小明'],
'sex': ['female', 'female', 'male', 'male'],
'year': [2001, 2001, 2003, 2002],
'city': ['北京', '上海', '广州', '北京']
}
df1 = pd.DataFrame(data1, index=['a', 'b', 'c', 'd']) # 给了行标签,但原来的行标签依然可用
# 创建方式2:后续添加列名
data2 = [['张三', 'female', '2001', '北京'],
['李四', 'female', 2001, '上海'],
['王五', "male", 2003, "上海"],
['小明', "male", 2002, '北京']]
col1 = ['name', 'year', 'sex', 'city']
df2 = pd.DataFrame(data2, columns=col1)
# 创建时的缺失值,高版本会报错,列名过多,无法生成dataframe
# df3 = pd.DataFrame(data2, columns=['name', 'year', 'sex', 'city', 'address'])
# 创建方式3:这种纯数字不给标签的,行列标签均自动生成
data3 = np.random.randint(1, 10, 9).reshape(3, 3)
df3 = pd.DataFrame(data3)
# dataframe的属性
feature1 = df1.values # 值
feature2 = df1.index # 行索引,如改过名则显示更名后的
feature3 = df1.columns # 列名
feature4 = df1.dtypes # 元素类型(按各列给出)
feature5 = df1.size # 元素个数
feature6 = df1.ndim # 维度
feature7 = df1.shape # 形状
print(feature2)
'''2.dataframe索引'''
# print('name' in df1.columns)
# print('a' in df1.index)
# 重新索引,高版本似乎不让有缺失值出现,所以这种索引更改不起作用
# method = 'ffill'或'pad',表示前向(用前面的)值填充
# method = 'bfill'或'backfill,表示后向(用后面的)值填充
# print(df2.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)) # 0补充缺失值
# df4 = pd.DataFrame(np.arange(9).reshape(3,3),index = ['a','c','d'],columns = ['one','two','four'])
# df4.reindex(index=['a','b','c','d'],columns=['one','two','three','four'])
# 将指定列设为索引
df5 = df1.set_index('city')
print(df5)
'''3.dataframe数据访问'''
ind1 = df1[:2] # 前两行
ind2 = df1.head(2) # 前两行
ind3 = df1.tail(2) # 后两行
ind4 = df1.sample(2) # 随机抽取2行
# loc名称索引
ind5 = df1.loc[:, ['name', 'year']]
# ind6 = df1.loc[['name', 'year']] # 错误用法
# ind6 = df1[:, ['name', 'year']] # 错误用法
ind7 = df1[['name', 'year']] # 这样倒是可以
ind8 = df1.loc[['a', 'b'], ['name', 'year']] # a,b行,name,year列
# iloc位置索引
ind9 = df1.iloc[:, :2]
# ind9 = df1[:, :2] # 错误用法
# ind9 = df1[0] # 错误用法
ind10 = df1.iloc[[0, 1], [0, 1]] # 0,1行,0,1列 明显与numpy不一样,这样写不是元素位置单独索引
# 布尔索引
ind11 = df1[df1["name"] == '李四']
print(df1["name"] == '李四') # 筛选出名称为李四的行
print("布尔索引测试:\n", df1)
ind12 = df1.loc[df1["name"] == '李四', 'sex'] # 布尔索引与loc索引混合使用
print("测试结果:\n", ind12) # b female
# 多重条件布尔索引
ind13 = df1[(df1["city"] == '北京') | (df1["sex"] == 'female')]
'''4.dataframe数据编辑'''
# 增加行数据
data3 = {'city':"兰州", "name":"李红", "year":"2000", "sex":"female" }
# 必须忽略索引,否则两个数组索引冲突,忽略之后会重新排列新的索引
print(df2.append(data3, ignore_index=True)) # 不是原地操作
# 增加列数据
df2["age"] = 20 # 原地操作
df2["c"] = ['1','2','3','4']
# 删除数据,默认不是原地,原地操作inplace = True
# 不写axis默认是行删除=0,删列一定要写axis=1
# 或者写index和columns来指定行列
print(df2.drop(1)) # 删去第1行
print(df2.drop([1, 3])) # 删去第1,3行
# print(df2.drop([[1,2],[1,3]])) # 错误用法,只能整个删除
# print(df2.drop("name")) # 错误用法,不写axis会默认行删除,这样找不到name的
print(df2.drop("name", axis=1))
print(df2.drop(columns=["name", "year"])) # 指定列名
'''5.dataframe数据读写'''
# 使用read_table来读取文本文件
# pd.read_table('filepath', sep='\t', header='infer', names=None, index_col=None)
# 使用read_csv函数来读取csv文件。
# df = pd.read_csv(r'.\tmp\meal_order_detail.csv', sep=',', header='infer', names=None, index_col=None)
# header=0,无列标题时默认使用。
# 如果有列标题时强行用0,会替换掉列名,列名下面一行当标题。
# =None,有列标题时默认使用
# index_col可以将指定列做索引,encoding用于在python无法解析编码的时候设置。
# 文本文件的存储和读取类似,结构化数据可以通过pandas中的to_csv函数实现以csv文件格式存储文件。
# pd.to_csv(path_or_buf=None, sep=',', columns=None, header=True, index=True,
# index_label=None, mode='w', encoding=None)
'''6.dataframe统计描述'''
print(df1.describe())
print(df1.info())
print(df1['year'].median())
print(df1['year'].var())
print(df1['year'].std())