# Author:Nimo_Ding
import pandas as pd
import numpy as np
# Pandas 可以说是基于 NumPy 构建的含有更高级数据结构和分析能力的工具包。
# 基于Series(一维的序列)和DataFrame(二维的表结构)这两个核心数据结构,pandas可以对数据进行导入清洗处理统计和输出
# Series是定长的字典序列,相当于两个ndarray,这也是和字典结构最大的不同,因为在字典的结构里,元素的个数是不固定的。
# Series有两个基本属性:index和values,在Series结构中,index默认是0、1、2。。。递增的整数序列。
# 当然也可以自己指定索引,比如index=['a','b','c','d']
import pandas as pd
from pandas import Series,DataFrame
x1=Series([1,2,3,4])
x2=Series(data=[1,2,3,4],
index=['a','b','c','d'])
print(x1)
'''
0 1
1 2
2 3
3 4
dtype: int64
'''
print(x2)
'''
a 1
b 2
c 3
d 4
dtype: int64
'''
# 采用字典的方式来创建Series:
d={
'a':1,
'b':2,
'c':3,
'd':4
}
x3=Series(d)
print(x3)
'''
a 1
b 2
c 3
d 4
dtype: int64
'''
# DataFrame类型数据结构类似数据库表
# 它包括了行索引和列索引,我们可以将DataFrame看成是由相同索引的Series组成的字典类型。
# 示例,输出考试成绩:
import pandas as pd
from pandas import Series,DataFrame
data={
'Chinese':[66,95,93,90,80],
'English':[65, 85, 92, 88, 90],
'Math':[30, 98, 96, 77, 90]
}
df1=DataFrame(data)
df2=DataFrame(data,
# 行索引
index=['zhangfei','guanyu','zhaoyun','huangzhong','dianwei'],
# 列索引
columns=['English','Math','Chinese'])
print(df1)
'''
Chinese English Math
0 66 65 30
1 95 85 98
2 93 92 96
3 90 88 77
4 80 90 90
'''
print(df2)
'''
English Math Chinese
zhangfei 65 30 66
guanyu 85 98 95
zhaoyun 92 96 93
huangzhong 88 77 90
dianwei 90 90 80
'''
# pandas允许直接从xlsx、csv等文件中导入数据,也可以输出到xlsx、csv等文件,非常方便。
# import pandas as pd
# from pandas import Series, DataFrame
# score = DataFrame(pd.read_excel('data.xlsx'))
# score.to_excel('data1.xlsx')
# print score
print('\n数据清洗:')
data = {'Chinese': [66, 95, 93, 90,80],
'English': [65, 85, 92, 88, 90],
'Math': [30, 98, 96, 77, 90]}
df2=DataFrame(data,
index=['ZhangFei','GuanYu','ZhaoYun','HuangZhong','DianWei'],
columns=['English', 'Math', 'Chinese'])
print(df2)
'''
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
'''
# 删除DataFrame中不必要的列或行
# df2=df2.drop(columns=['Chinese']) # 删除列
# df2=df2.drop(index=['ZhangFei']) # 删除行
# 重命名列名columns
# df2.rename(columns={
# 'Chinese':'Yuwen',
# 'English':'Yingyu'
# },inplace=True)
# print(df2)
# 去重复的值
df2=df2.drop_duplicates()
# 格式问题:
print('\n# 1、更改数据格式')
# df2['Chinese'].astype(np.int64) # Chinese字段的值改成int64类型
df2['Chinese']=df2['Chinese'].astype('str') # Chinese字段的值改成str类型
print(df2['Chinese'])
# 2、删除数据间的空格
df2['Chinese']=df2['Chinese'].map(str.strip)
df2['Chinese']=df2['Chinese'].map(str.lstrip)
df2['Chinese']=df2['Chinese'].map(str.rstrip)
# 删除数据中某个特殊的符号$
df2['Chinese']=df2['Chinese'].str.strip('$')
print('\n# 3、大小写转换')
# df2.columns=df2.columns.str.upper() # 全部大写
# df2.columns=df2.columns.str.lower() # 全部小写
# df2.columns=df2.columns.str.title() # 首字母大写
print('\n# 查找空值')
data = {'语文': [66, 95, 93, 90,80],
'英语': [65, 85, 92, 88, 90],
'数学': [None, 98, 96, 77, 90]}
df=DataFrame(data,
index=['张飞','关羽','赵云','黄忠','典韦'],
columns=['语文', '英语', '数学'])
print(df)
print(df.isnull()) # 看出表中哪一个值为none。
'''
语文 英语 数学
张飞 False False True
关羽 False False False
赵云 False False False
黄忠 False False False
典韦 False False False
'''
print(df.isnull().any()) # 看出哪一列有none值,会显示为True。
'''
语文 False
英语 False
数学 True
dtype: bool
'''
print('\n使用apply函数对数据进行清洗:')
# apply函数式pandas中自由度非常高的函数,使用频率也高。
df['语文'].astype('int')
# df['语文']=df['语文'].apply(str.upper)
print(df)
'''
语文 英语 数学
张飞 66 65 NaN
关羽 95 85 98.0
赵云 93 92 96.0
黄忠 90 88 77.0
典韦 80 90 90.0
'''
print('\n# 定义函数:')
def double_df(x):
return 2*x
df['语文']=df['语文'].apply(double_df)
print(df)
'''
语文 英语 数学
张飞 132 65 NaN
关羽 190 85 98.0
赵云 186 92 96.0
黄忠 180 88 77.0
典韦 160 90 90.0
'''
# 定义函数:新增两列:
def plus(df,n,m):
df['new1']=(df['语文']+df['英语'])*m
df['new2']=(df['语文']+df['英语'])*n
return df
# axis=1表示按照列为轴进行操作,args后是传递的两个参数。
df=df.apply(plus,axis=1,args=(2,3,))
print(df)
'''
语文 英语 数学 new1 new2
张飞 132.0 65.0 NaN 591.0 394.0
关羽 190.0 85.0 98.0 825.0 550.0
赵云 186.0 92.0 96.0 834.0 556.0
黄忠 180.0 88.0 77.0 804.0 536.0
典韦 160.0 90.0 90.0 750.0 500.0
'''
print('\n数据统计:')
# pandas和numpy一样都有常用的统计函数,如果遇到空值nan,会自动排除。
# describe函数最简便。
print(df1.describe())
'''
数据统计:
Chinese English Math
count 5.000000 5.000000 5.000000
mean 84.800000 84.000000 78.200000
std 11.987493 10.931606 28.163807
min 66.000000 65.000000 30.000000
25% 80.000000 85.000000 77.000000
50% 90.000000 88.000000 90.000000
75% 93.000000 90.000000 96.000000
max 95.000000 92.000000 98.000000
'''