本节内容:

1、读取excel、写入excel
2、列操作
3、行操作
4、对某行某列的时间进行提取年、月、日、时分秒

一、读取excel、写入excel

要导入的模块

import pandas as pd
import time

1、读取excel

test.xlsx文件内容

file = 'test.xlsx'                   # 拿到的DataFrame对象
dfB = pd.read_excel(file, header=0)  # 首行--列索引,行索引为隐式索引0,1,2

2、DF获取行数和列数

dfB.shape   # 获取行数和列数
dfB.index   # 获取所有的行索引  RangeIndex(start=0, stop=3, step=1)
dfB.columns   # 获取所有的列索引  Index(['姓名', '年龄', '工资', '特长'], dtype='object')
dfB.values  # 获取所有的值,以行为单位
            # array([[第一行内容],[第二],[...]],dtype=object)

二、列操作

1、获取想要的列

# 这样的拿到的才是一个DF对象,           dfB["姓名"]是Series对象
dfC = dfB[['姓名', '工资']]  # 获取想要的列

2、新增一列

dfC['学校'] = ''   # 全部为空
dfC['学校'] = '阳光中学'   # 该列的所有行,值全部为阳光中学

3、删除一列和保留需要的列

# 删除某列
dfB.drop(['特长'], axis=1)  # axis中, 0表示行,1表示列

#需要保留的字段
columnsB = list(dfB.columns)+['国家','城市']
dfB = dfB[columnsB]   # 根据列表中的元素,取出所有要的列

4、根据已有两列拼成,新的一列

根据学生姓名和学号拼成一列,用于一次识别两列
# 直接拼接姓名和学号,生成学生ID
dfB['学生ID']=dfB[['姓名','学号']].agg(lambda x:str(x[0])+'$$'+str(x[1]),axis=1)

# 还可以对列进行切片,即取学号的前几位或者后几位
dfB['学生ID']=dfB[['姓名','学号']].agg(lambda x:str(x[0])+'$$'+str(x[1])[:-2],axis=1)

5、根据某一列分组,根据学生ID分组,

相当于将学生ID相同的合并,相同的行记录会被合并成一行
学生的年龄根据学生ID进行分组,
# 拿到的是一个SeriesGroupBy对象,pandas.core.groupby.SeriesGroupBy
groupB = dfB['工资'].groupby(dfB['学生ID'])

# 对工资求和,拿到pandas.core.series.Series
grB = groupB.sum()

# 将Series转成DF对象
dict_grB = {'学生ID':grB.index,'工资':grB.values}
dfD = pd.DataFrame(dict_grB)  # 仅含2列的df,

6、根据该行的某列的值,获取该行另外一列的值

根据学生ID,获取该学生的工资
# 获取所有符合条件的学生ID,都会被拿到
gong_zi = dfB[dfB['学生ID'] == id]

# 只要工资这一列,的每一行
gong_zi = dfB[dfB['学生ID'] == id]['工资']

7、根据该行的某一列值,获取到该行,修改该行的另外一列的值

根据学生ID,修改该学生的工资
dfB.loc[dfB['学生ID']==id, '工资'] = 1000

8、用列(列的值)取交集,merge

根据学生ID取交集,对两个DF取交集
# 对dfA和dfB取交集,根据相同的学生ID
jiao_ji = pd.merge(dfA, dfB, on=["学生ID"])

# 根据相同的学生ID和年龄
jiao_ji = pd.merge(dfA, dfB, on=["学生ID", '年龄'])

9、提取日期单元格的日期信息

拿到所有的入学日期,是一个包含所有日期的对象
# 拿到所有的日期
date_time =dfB['入学日期']
format_time = [time.strptime(str(a), '%Y-%m-%d') for a in date_time]

# 取出该日期对象的,年、月,生成新的列
dfD["YEAR"] = [a.tm_year for a in format_time]
dfD["MON"] = [a.tm_mon for a in format_time]

10、取出该列中不等于某个值的数据

取出姓名不为小明的学生
df_f = dfB[dfB['姓名'] != '小明']

11、取出,a列为1而且b列为c的行

取出姓名为小明且年龄大于10的学生
# 取出姓名为小明且年龄大于10的学生,有可能是个集合
dfB.loc[(dfB['姓名']=='小明')& (dfA['年龄'] > 10)]

# 修改其的值,
dfB.loc[(dfB['姓名']=='小明')& (dfA['年龄'] > 10), '工资'] = 1400元

12、删除含有空的行

只要某行中,任一列有空值,即会被删除
dfB.dropna(inplace =True)   # 去掉B表中,有NAN的行

13、对某一列的所有值,去掉两端的空格

# 对姓名列的值去空,防止比对时,受到空格影响
dfB['姓名']=dfB['姓名'].apply(lambda x:x.strip())

三、行操作



0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *