【Python】DataFrame学习01_创建、索引、访问、编辑、读写、统计描述

本人依据上课学习内容,将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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值