Pandas的构造、增删改查、时间序列索引及合并DataFrame

一、简单的构造Series和DataFrame

import pandas as pd
dict1 = {'a': 1, 'b': 2, 'd': 3, 'e': 4, 'f': 5}
series1 = pd.Series(dict1)
print(series1.append(pd.Series({'g': 6})))  # append这种方法就不要用了
# 容器,索引自定义构造,元组和列表效果一样,单一数据类型会重复给索引
# ( data数组, index索引, dtype数据类型会自判断, name名字, copy能否复制)
series2 = pd.Series((1, 2, 3), index=['a', 'b', 'c'], name='数组')
# 取值的话可以根据自定义的索引或者默认的下标,类似list
dict2 = {'sites': ["Google", "Runoob", "Wiki"], 'number': [1, 2, 3]}
dataframe1 = pd.DataFrame(dict2)  # 构造一个dataframe,也可以以多个series构造
dict3 = {'one': [3, 2, 2], 'two': [1, 2, 3]}
dataframe2 = pd.DataFrame(dict3)
print(dataframe2.describe())  # describe()可参数为每列统计信息count、mean、标准差、最大最小、四分位值,不指定全出
print(dataframe2.info())  # 行,列,有没有空值,数据类型
print(dataframe2)
for i in dataframe2.iterrows():  # 按照1行遍历,返回一个元组包含每行的详细信息
    print(i, type(i))
print(dataframe2.T)
dataframe3 = pd.DataFrame(dict3, index=['a', 'b', 'c'])  # 更换索引
dataframe4 = pd.DataFrame(  # 行列二级索引
        {
            ('a', 'a'): {('A', 'B'): 1, ('A', 'C'): 2},
            ('a', 'b'): {('A', 'C'): 1, ('A', 'B'): 2},
            ('a', 'b'): {('A', 'D'): 1, ('A', 'C'): 2},
        }
    )

二、Series及DataFrame的增删改查

import pandas as pd
import numpy as np
# 1.1构造一个DataFrame,我从外部导入一个命名df
df = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表.csv')
# 1.2查看DataFrame的基础信息
print(df.shape)
print(df.columns.tolist())  # 把列索引转化成列表,即表头
print(df.index.tolist())  # 把行索引转化成列表,默认从0开始
print(df.dtypes)  # 查看每列的数据类型
# 1.31.DataFrame的列查询
print(df['age'])  # 直接按照列索引读出年龄列,多列要把列索引放进list中传参
print(df.iloc[:, 0:2])  # 根据下标取列
# 1.32.DataFrame的行查询
print(df[0:1])  # 按照行下标查询类似列表切片
print(df.head(1))  # 从第一行往后读参数个列
print(df.tail(2))  # 从最后一行往前读参数个列
print(df.loc[0])  # 根据下标取行
# 1.33.DataFrame的行列查询df.loc[index, column]或者df.iloc[row_index, column_index]可以是单个参数也可以是列表参数或者条件
# tip.以下是应用的小插曲
print(df.groupby('department')[['age', 'salary']].mean())  # 将将数据聚合到部门内,以此做年龄和薪资的平均数
print(df['department'].value_counts())  # 将部门series单列出来统计不同部门的人员数
print(df['department'].unique())  # 部门列中不重复的内容,用来计算部门个数
# 1.41.DataFrame的改,索引改动
df.rename(index={0: 3, 1: 2, 2: 1, 3: 0}, inplace=True)  # 修改索引,不可以用新名字作为列表直接替换
# df.index = [3, 2, 1, 0]  # 直接修改行索引
# df.columns = [’column_name‘]  # 改一个也要写全部的名字
# mapper是个映射单纯改名字也可以不写,行也类似,axis=0即可
df.rename(mapper={'name': 'Name', 'age': 'Age', 'department': 'Department',  # 修改列的名字
                  'salary': 'Salary', 'id': 'ID'}, axis='columns', inplace=True)
# 1.42.DataFrame的改,内容引改动,在行列查找直接复制就行
# 1.5.DataFrame的删除,行删除直接索引,或者axis=0
df.drop(['Age', 'Salary'], axis=1, inplace=True)  # inplace默认为True直接改变原表,指定F则不改变,T是动作F相当函数
df.drop(df.columns[[0]], axis=1, inplace=True)  # 按照下标删除
# del df['Name']  # 删除Name列
# ndf = df.pop('Department')  # 删除列并返回删除值
print(df)
# 1.61.DataFrame的列增加,insert()按照下标,直接新索引添加,loc位置下标添加,下标就是默认的数字索引,索引就是列名columns
names = np.array(['lily', 'anday', 'lilylucy', 'tomanday'])
df.insert(1, 'name', names)  # 直接用列表、元组也行就是出黄色警告,insert必须是同种类型
salary = [1000, 2000, 3000, 5000]
df['salary'] = salary  # 这个和字典比较像,有列名就是替换,没有就是尾部增加
df.loc[:, "sex"] = ['m', 'f', 'm', 'f']  # 按照位置也是一个尾部追加
# 1.62.DataFrame的行增加,必须同类型同列名append()在尾部添加,loc位置下标添加
df1 = pd.DataFrame({'ID': (5, 6), 'name': ('jack', 'tom'), 'Department': ('HR', 'BP'),
                    'salary': (1000, 8000), 'sex': ('f', 'f')}, index=[7, 8])
df2 = df.append(df1, ignore_index=False)  # 这种方式即将被移除ignore_index默认F采用自己下标,T则新生成
df2.loc[9] = [7, 'maico', 'Leader', 1, 'm']  # 下标不同添加,相同则为改变
print(df2)

三、构建时间序列索引

import pandas as pd
import numpy as np
# 构造时间索引
print('-------------指定个数均匀时间序列:[2020/1/1,2022/10/1]之间均匀产生8个时间点------------')
index1 = pd.date_range(start='2020/1/1', end='2022/10/1', periods=8)
print(index1)
print('-------------在2022/9/1-2022/10/1之间指定固定间隔的时间序列,如果ferq不能均分要指定左闭还是右闭------------')
index2 = pd.date_range(start='2022/9/28', end='2022/10/1', freq='15h', inclusive='right')
print(index2)
print('-------------构造一个[2022/9/28-2022/10/1]时间序列,内容是0-1随机数------------')
index3 = pd.date_range(start='2022/9/28', end='2022/10/1', freq='24h')
dataframe1 = pd.DataFrame(np.random.rand(4, 3), index=index3, columns=['a', 'b', 'c'])
print(dataframe1)
print('-------------计算时间间隔[2022/9/28-2022/10/1]之间有几天------------')
print(pd.to_datetime('2022/10/1')-pd.to_datetime('2022/9/28'))
print('-------------------------获取dataframe1前2行-------------------------------')
print(dataframe1[:2])

四、DataFrame的合并

import pandas as pd
import numpy as np
df = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表1.csv')
print(df)
print('-----------------------利用bool索引过滤数据----------------------------')
print(df[df.age >= 30])
print('-----------------------apply()函数添加辅助列----------------------------')
df['薪资标准'] = df.loc[:, 'salary'].apply(lambda x: '>=3k' if x >= 3000 else '<3k')
print(df)
print('-----------------------利用函数过滤数据----------------------------')
print(df[df.department.isna()])
print(df[df.薪资标准.isin(['<3k'])])
# print(df[~df.薪资标准.isin(['<3k'])])  # ~isin()中的取反标志
print(df[df['薪资标准'] == '>=3k'])
print('-----------------------内置函数统计计算----------------------------')
print(df['salary'].sum(), df['salary'].mean(), df['salary'].max())
print('-----------------------对一列数据进行多项操作,但是匿名函数只能用一次----------------------------')
print(df['salary'].transform([lambda x: '>=3k' if x >= 3000 else '<3k', np.abs, np.sqrt]))
print('-----------------------这个视频map、apply、transform讲的迷离----------------------------')
print(df['salary'].map(lambda x: '>=3k' if x >= 3000 else '<3k'))
print(df['salary'].apply(lambda x: '>=3k' if x >= 3000 else '<3k'))
print('-----------------------合并contact()函数----------------------------')
df1 = pd.read_csv('F:/python学习文件/实验文件夹/Pandas学习/员工表.csv')
df2 = pd.concat([df1, df])  # 默认按照行合并axis=0,不增加二级索引key=[x, y],∪集组合join='outer'
print(df2)
df3 = pd.concat([df1, df], axis=1, join='inner', keys=['c', 'd'])
print(df3)
print('-----------------------功能更强大的merge()函数----------------------------')
df4 = pd.merge(df1, df, how='outer')  # on=[列名, …],how=inner/outer/left/right,validate='one_to_many'
# 基于列名的merge,在相同列里,元素相同的∩,how不指定就是inner-right,指定左右就变成了outer了
# validate='one_to_many'一对多
print(df4)

猜你喜欢

转载自blog.csdn.net/lizhyangmm/article/details/127146168
今日推荐