本人依据上课学习内容,将dataframe内容浓缩为代码块,一下是今天学习的第一部分:
1.dataframe创建
2.dataframe索引
3.dataframe数据访问(重要)
4.dataframe数据编辑
5.pandas数据读写
6.dataframe统计描述
说实话有很多地方感觉可以使用的用法、查阅也能用的用法在这里不能用,这使我非常迷惑,希望有朋友可以指点一二。
本文于2021/12/11首发于csdn,如有错误和不足请指出。
----更新记录----
2021/12/13更新了数据编辑的drop函数的axis问题例子;更新了数据访问布尔索引的例子;想要原地 *** 作的话,设置inplace = True即可。
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 # 佛了我,为啥这个不能用,我不理解 # ind12 = 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'.tmpmeal_order_detail.csv', sep=',', header='infer', names=None, index_col=None) # header指定列名,不写会默认用文件内列名,header=0也是用原列名做列名,=1用第0行数据做列名 # 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())
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)