天天看点

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

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的值。 

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

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')
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
#to_string()返回所有数据
print(df.to_string())
           
#head(n)返回数据前n行,默认为5
df = df.head()
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
tail(n)返回数据后n行,默认后5
df = df.tail(4)
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
#info()返回文件基本信息
df.info()
           

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

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]
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

3.1.2 排序

#按照Age字段,降序排列
df.sort_values("Age", ascending=False)
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

3.1.3 分组

#一般配合计算函数使用,
#mean()   平均值
#sum()    累加
survived_group = df.groupby("Team")
survived_group.mean().head()
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

        Salary一列,因为数值太大,被科学记数了。解决科学计数的问题,加上一下代码就行。

pd.set_option('display.float_format', lambda x: ' % .2f' % x)
           

        groupby()默认不统计为空的项,可以加上参数dropna=Fales实现统计。

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

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
           

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

df['test2'] = df.apply(lambda x: 'abc',axis=1)
df
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

3.1.5 数据清洗

        判断是否为空

#isnull() 判断每个数据是否为空,返回True或者False
df.isnull()
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
df.loc[n].isnull()  #判断第n行的每个数据是否为空
df[n].isnull()      #判断第n列的每个数据是否为空
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
any()       #以列为基准,当该列任一数据为True返回true,否则返回false
any(axis=1) #以行为基准,当行任一数据为True返回true,否则返回false
#结合isnull()使用,可以判断每列或者每行是否存在空值
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
#返回存在空值的数据
#不能写成df[df.isnull().any()],会报错!!!!!
df[df.isnull().any(axis=1)]
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

          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)  #删除含有空数据的列
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

替换空数据 

#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
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

         图中可以看出没有带参数inplace=True,原始数据df中的值并没有被修改。

删除列

df.drop(["Name", "Number"],axis=1)
df.drop(columns=["Name", "Number"])
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

删除行

df.drop(index=n)   #删除第n行
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

        删除也有参数: 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:所有数据保持原值
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

        要转换的数据中如果含有非数字的部分,默认会返回异常。可以用参数errors处理。

Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

日期样式修改

pd.to_datetime(arg)
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

删除重复项

#inplace = True  修改源数据
df.drop_duplicates(inplace = True)
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析

 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  排除不要的数据类型
           
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
Pandas(持续更新)一、数据结构二、CSV文件读写  三、数据分析
count 有效值计数
mean 平均值
std 标准差
min         最小值
25% 四分之一分位数
50% 二分之一分位数
75% 四分之三分位数
max 最大值
unique 不同的值有多少个
top 最常见的值
freq 最常见的值的频率

继续阅读