API地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html
一、数据结构
1.1 Series
Series类似表格中的一个列(column)或者一维数组,可以保存任何数据类型。
pandas.Series( data, index, dtype, name, copy)
#data:一组数据(ndarray 类型)。
#index:数据索引标签,如果不指定,默认从 0 开始。
#dtype:数据类型,默认会自己判断。
#name:设置名称。
#copy:拷贝原始数据后生成series,默认为 False。
从下图可以看到当copy=False,修改series的值,对应的array值也会改变。但是当copy=True时,对应的array值不会改变,因为是用拷贝的数据生成的。
需要注意,改变series只会影响array的值,不影响列表a的值。
1.1.1 列表(list)生成series
import pandas as pd
a = [1, 'xy', {'a': 3}]
ser = pd.Series(b,copy=False)
print(ser)
输出:
#索引 值
0 1
1 ab
2 {'a': 3}
dtype: object
#索引取值
print(a[1])
输出:
xy
#自定义索引
myvar2 = pd.Series(a, index=['x', 'y' , 'z'])
print(myvar2)
输出:
x 1
y xy
z {'a': 3}
dtype: object
1.1.2字典(dict)生成series
import pandas as pd
a = {
'a': 'A',
'b': 'B',
'c': 'C'
}
#指定名称
myvar = pd.Series(a, name='test')
print(myvar)
输出:
a A
b B
c C
Name: test, dtype: object
#字典生成series可以根据字典key的值截取数据
myvar2 = pd.Series(a, index=['a', 'c'])
print(myvar2)
输出:
a A
c C
dtype: object
1.2 DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
pandas.DataFrame( data, index, columns, dtype, copy)
#data:一组数据(ndarray、series, map, lists, dict 等类型)。
#index:索引值,或者可以称为行标签。
#columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
#dtype:数据类型。
#copy:拷贝数据,默认为 False。copy的意义与Series一样。
1.2.1 列表(list)生成DataFrame
a = [['a', 'b', 'c'], [1, 2, 3]]
myvar = pd.DataFrame(a)
print(myvar)
输出:
0 1 2
0 a b c
1 1 2 3
#自定义行索引
myvar = pd.DataFrame(index=['x', 'y'])
print(myvar)
输出:
0 1 2
x a b c
y 1 2 3
#自定义列索引
myvar2 = pd.DataFrame(a, columns=['A','B','C'])
print(myvar2)
输出:
A B C
0 a b c
1 1 2 3
#根据行索引取一行的值
print(myvar2.loc[0])
输出:
A a
B b
C c
Name: 0, dtype: object
#loc函数取出来的其实就是一个Series
print(myvar2.iloc[0, :])
输出:
A a
B b
C c
Name: 0, dtype: object
#根据列索引取一列
print(myvar2['C'])
输出:
0 c
1 3
Name: 2, dtype: object
#行列索引取具体值
print(myvar2.loc[0]['A'])
输出:
a
print(myvar2.iloc[0, 0])
输出:
a
#列行索引取具体值
print(myvar2['A'][0])
输出:
a
PS:行列取值和列行取值,写法不一样。
1.2.2 字典(dict)生成DataFrame
#没有对应的部分,数据自动补充为为NaN
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data,index=['x','y'])
print(df)
输出:
a b c
x 1 2 NaN
y 5 10 20.0
#NaN并不是字符串
print(type(df.loc['x']['c']))
输出:
<class 'numpy.float64'>
#下面这种方式要求每列数据的个数一样,不然会报错
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)
输出:
Site Age
0 Google 10
1 Runoob 12
2 Wiki 13
二、CSV文件读写
2.1 读文件
#输出结果为数据的前面 5 行和末尾 5 行,中间部分以 ... 代替
df = pd.read_csv('nba.csv')
#to_string()返回所有数据
print(df.to_string())
#head(n)返回数据前n行,默认为5
df = df.head()
tail(n)返回数据后n行,默认后5
df = df.tail(4)
#info()返回文件基本信息
df.info()
2.2 写文件
#to_csv(file,index=False)
#一定要加index=Fales,不然会把行索引当成数据,写到文件里。
#写是覆盖性质的。
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
df.to_csv('test.csv', index=False)
三、数据分析
3.1 预处理
3.1.1 筛选
#筛选出年龄大于等于25岁的数据
df[df["Age"] >= 25]
3.1.2 排序
#按照Age字段,降序排列
df.sort_values("Age", ascending=False)
3.1.3 分组
#一般配合计算函数使用,
#mean() 平均值
#sum() 累加
survived_group = df.groupby("Team")
survived_group.mean().head()
Salary一列,因为数值太大,被科学记数了。解决科学计数的问题,加上一下代码就行。
pd.set_option('display.float_format', lambda x: ' % .2f' % x)
groupby()默认不统计为空的项,可以加上参数dropna=Fales实现统计。
3.1.4 添加数据列
原始数据中,如果需要添加一列数据,或者计算出一个新列。使用apply()来实现这个功能。
apply()需要传入一个生成数据的函数。
DataFrame.apply(func, axis=1)
#func 生成数据的函数
#axis 函数应用到每列还是每行。默认axis=0应用到列。
def test(age, weight):
a = weight/age
return a
df['test'] = df[['Age','Weight']].apply(lambda x: test(x['Age'],x['Weight']),axis=1)
df
df['test2'] = df.apply(lambda x: 'abc',axis=1)
df
3.1.5 数据清洗
判断是否为空
#isnull() 判断每个数据是否为空,返回True或者False
df.isnull()
df.loc[n].isnull() #判断第n行的每个数据是否为空
df[n].isnull() #判断第n列的每个数据是否为空
any() #以列为基准,当该列任一数据为True返回true,否则返回false
any(axis=1) #以行为基准,当行任一数据为True返回true,否则返回false
#结合isnull()使用,可以判断每列或者每行是否存在空值
#返回存在空值的数据
#不能写成df[df.isnull().any()],会报错!!!!!
df[df.isnull().any(axis=1)]
Pandas 只把 n/a 、 NA、None 当作空数据。也可以在读取文件时指定空数据类型。
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('test.csv', na_values = missing_values)
删除空数据
找到存在空数据的列或者行,就可以根据需要删除列或者行。
df.dropna() #删除含有空数据的行
df.dropna(axis=1) #删除含有空数据的列
替换空数据
#inplace=True 修改原始数据。如果不写这个参数,则不修改原始数据。
df.fillna(value, inplace=True) #替换所有空值为value
df.loc[n].fillna(value, inplace=True) #替换第n行的空值为vlaue
df[n].fillna(value, inplace=True) #替换第n列的空值为vlaue
图中可以看出没有带参数inplace=True,原始数据df中的值并没有被修改。
删除列
df.drop(["Name", "Number"],axis=1)
df.drop(columns=["Name", "Number"])
删除行
df.drop(index=n) #删除第n行
删除也有参数: inplace:bool, default False。控制是否修改源数据。
数值类型修改
pd.to_numeric(arg, downcast='', errors='')
#downcast:{‘integer’, ‘signed’, ‘unsigned’, ‘float’}, default None
#‘integer’ or ‘signed’: smallest signed int dtype (min.: np.int8)
#‘unsigned’: smallest unsigned int dtype (min.: np.uint8)
#‘float’: smallest float dtype (min.: np.float32)
#errors:{‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’
#rasie:触发异常
#coerce:非数字型数据强制转为NaN
#ignore:所有数据保持原值
要转换的数据中如果含有非数字的部分,默认会返回异常。可以用参数errors处理。
日期样式修改
pd.to_datetime(arg)
删除重复项
#inplace = True 修改源数据
df.drop_duplicates(inplace = True)
3.2 特征分析
pd.set_option('display.float_format', lambda x: ' % .2f' % x)
df = pd.read_csv('nba.csv')
df.describe(percentiles, include, exclude)
#percentiles 设定数值型特征的统计量,默认是[.25, .5, .75],也就是返回25%,50%,75%数据量时的数字
#include 指定需要统计的数据类型,默认是只计算数值型特征的统计量,include='object' 或者include='O'计算离散型统计量,include='all'计算所有。
#exclude 排除不要的数据类型
count | 有效值计数 |
mean | 平均值 |
std | 标准差 |
min | 最小值 |
25% | 四分之一分位数 |
50% | 二分之一分位数 |
75% | 四分之三分位数 |
max | 最大值 |
unique | 不同的值有多少个 |
top | 最常见的值 |
freq | 最常见的值的频率 |