Python12--数据分析Pandas库进阶一

一、Pandas的函数应用

1,apply 和 applymap

(1)可直接使用NumPy的函数

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# Numpy ufunc 函数
df = pd.DataFrame(np.random.randn(5,4) - 1)
print(df)

print(np.abs(df))

显示结果:
Python12--数据分析Pandas库进阶一_第1张图片

(2)通过apply将函数应用到列或行上

指定轴的方向,默认axis=0,方向是列
指定轴方向,axis=1,方向是行

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# Numpy ufunc 函数
df = pd.DataFrame(np.random.randn(5,4) - 1)
print(df)

# 使用apply应用行或列数据
#f = lambda x : x.max()
print(df.apply(lambda x : x.max()))

print(df.apply(lambda x : x.max(), axis=1))

显示结果:
Python12--数据分析Pandas库进阶一_第2张图片

(3)通过applymap将函数应用到每个数据上

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# Numpy ufunc 函数
df = pd.DataFrame(np.random.randn(5,4) - 1)
print(df)

# 使用applymap应用到每个数据
f2 = lambda x : '%.2f' % x
print(df.applymap(f2))

显示结果:
Python12--数据分析Pandas库进阶一_第3张图片

2,排序

(1)索引排序

格式:sort_index()
含义:排序默认使用升序排序,ascending=False 为降序排序

Series操作
示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# Series
s4 = pd.Series(range(10, 15), index = np.random.randint(5, size=5))
print(s4)

# 索引排序
s4.sort_index() # 0 0 1 3 3

显示结果:
索引排序

DataFrame操作时注意轴方向
示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# DataFrame
df4 = pd.DataFrame(np.random.randn(3, 5), 
                   index=np.random.randint(3, size=3),
                   columns=np.random.randint(5, size=5))
print(df4)

df4_isort = df4.sort_index(axis=1, ascending=False)
print(df4_isort) # 4 2 1 1 0

显示结果:
DataFrame操作

(2)按值排序

格式:sort_values(by='column name')
含义:根据某个唯一的列名进行排序,如果有其他相同列名则报错。

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# DataFrame
df4 = pd.DataFrame(np.random.randn(3, 5), 
                   index=np.random.randint(3, size=3),
                   columns=np.random.randint(5, size=5))
print(df4)

# 按值排序
df4_vsort = df4.sort_values(by=3, ascending=False)
print(df4_vsort)

显示结果:
按值排序

3,处理缺失数据

(1)自动补充NaN

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],
                       [np.nan, 4., np.nan], [1., 2., 3.]])
print(df_data.head())

显示结果:
自动补充NaN

(2)判断是否存在缺失值:isnull()

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],
                       [np.nan, 4., np.nan], [1., 2., 3.]])
print(df_data.isnull())

显示结果:
判断是否存在缺失值

(3)丢弃缺失数据:dropna()

根据axis轴方向,丢弃包含NaN的行或列。

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],
                       [np.nan, 4., np.nan], [1., 2., 3.]])

# dropna
print(df_data.dropna())

print(df_data.dropna(axis=1))

显示结果:
丢弃缺失数据

(4)填充缺失数据:fillna()

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],
                       [np.nan, 4., np.nan], [1., 2., 3.]])

print(df_data.fillna(-100.))

显示结果:
填充缺失数据

二、数据清洗、合并、转化和重构

1,数据连接

pd.merge
根据单个或多个键将不同DataFrame的行连接起来
类似数据库的连接操作

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

print(df_obj1)
print(df_obj2)

显示结果:
Python12--数据分析Pandas库进阶一_第4张图片

(1)默认将重叠列的列名作为“外键”进行连接

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# 默认将重叠列的列名作为“外键”进行连接
print(pd.merge(df_obj1, df_obj2))

显示结果:
重叠列的列名作为“外键”进行连接

(2)on显示指定“外键”

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# on显示指定“外键”
print(pd.merge(df_obj1, df_obj2, on='key'))

显示结果:
on显示指定“外键”

(3) left_on,左侧数据的“外键”,right_on,右侧数据的“外键”

默认是“内连接”(inner),即结果中的键是交集

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# left_on,right_on分别指定左侧数据和右侧数据的“外键”

# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})

print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2'))

显示结果:
left_on与right_on

(4)“外连接”(outer),结果中的键是并集

how指定连接方式

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})

# “外连接”
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='outer'))

显示结果:
“外连接”(outer),结果中的键是并集

(5)“左连接”(left)

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})

# 左连接
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='left'))

显示结果:
“左连接”(left)

(6)“右连接”(right)

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data2' : np.random.randint(0,10,3)})

# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})

# 右连接
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='right'))

显示结果:
“右连接”(right)

(7)处理重复列名

格式:suffixes,默认为_x, _y

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# 处理重复列名
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
                        'data' : np.random.randint(0,10,3)})

print(pd.merge(df_obj1, df_obj2, on='key', suffixes=('_left', '_right')))

显示结果:
处理重复列名

(8)按索引连接

格式:left_index=True或right_index=True

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# 按索引连接
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'data2' : np.random.randint(0,10,3)}, index=['a', 'b', 'd'])

print(pd.merge(df_obj1, df_obj2, left_on='key', right_index=True))

显示结果:
按索引连接

2,数据合并

(1)NumPy的concat

格式:np.concatenate

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

arr1 = np.random.randint(0, 10, (3, 4))
arr2 = np.random.randint(0, 10, (3, 4))

print(arr1)
print(arr2)

print(np.concatenate([arr1, arr2]))
print(np.concatenate([arr1, arr2], axis=1))

显示结果:
Python12--数据分析Pandas库进阶一_第5张图片

(2)pd.concat

指定轴方向,默认axis=0
join指定合并方式,默认为outer
Series合并时查看行索引有无重复

index 没有重复的情况

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# index 没有重复的情况
ser_obj1 = pd.Series(np.random.randint(0, 10, 5), index=range(0,5))
ser_obj2 = pd.Series(np.random.randint(0, 10, 4), index=range(5,9))
ser_obj3 = pd.Series(np.random.randint(0, 10, 3), index=range(9,12))

print(ser_obj1)
print(ser_obj2)
print(ser_obj3)

print(pd.concat([ser_obj1, ser_obj2, ser_obj3]))
print(pd.concat([ser_obj1, ser_obj2, ser_obj3], axis=1))

显示结果:
Python12--数据分析Pandas库进阶一_第6张图片

index 有重复的情况

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

# index 有重复的情况
ser_obj1 = pd.Series(np.random.randint(0, 10, 5), index=range(5))
ser_obj2 = pd.Series(np.random.randint(0, 10, 4), index=range(4))
ser_obj3 = pd.Series(np.random.randint(0, 10, 3), index=range(3))

print(ser_obj1)
print(ser_obj2)
print(ser_obj3)

print(pd.concat([ser_obj1, ser_obj2, ser_obj3]))

显示结果:
Python12--数据分析Pandas库进阶一_第7张图片

DataFrame合并时同时查看行索引和列索引有无重复

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj1 = pd.DataFrame(np.random.randint(0, 10, (3, 2)), index=['a', 'b', 'c'],
                       columns=['A', 'B'])
df_obj2 = pd.DataFrame(np.random.randint(0, 10, (2, 2)), index=['a', 'b'],
                       columns=['C', 'D'])
print(df_obj1)
print(df_obj2)

print(pd.concat([df_obj1, df_obj2]))
print(pd.concat([df_obj1, df_obj2], axis=1, join='inner'))

显示结果:
Python12--数据分析Pandas库进阶一_第8张图片

3,数据重构

(1)stack

将列索引旋转为行索引,完成层级索引
DataFrame->Series

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
print(df_obj)

stacked = df_obj.stack()
print(stacked)

显示结果:
Python12--数据分析Pandas库进阶一_第9张图片

(2)unstack

将层级索引展开
Series->DataFrame
认操作内层索引,即level=-1

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
print(df_obj)

stacked = df_obj.stack()
# 默认操作内层索引
print(stacked.unstack())

# 通过level指定操作索引的级别
print(stacked.unstack(level=0))

显示结果:
Python12--数据分析Pandas库进阶一_第10张图片

4,数据转换-处理重复数据

(1)duplicated() 返回布尔型Series表示每行是否为重复行

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj = pd.DataFrame({'data1' : ['a'] * 4 + ['b'] * 4,
                       'data2' : np.random.randint(0, 4, 8)})
print(df_obj)

print(df_obj.duplicated())

显示结果:
Python12--数据分析Pandas库进阶一_第11张图片

(2)drop_duplicates() 过滤重复行

默认判断全部列,可指定按某些列判断

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

df_obj = pd.DataFrame({'data1' : ['a'] * 4 + ['b'] * 4,
                       'data2' : np.random.randint(0, 4, 8)})
print(df_obj)

print(df_obj.drop_duplicates())
print(df_obj.drop_duplicates('data2'))

显示结果:
Python12--数据分析Pandas库进阶一_第12张图片

(3)根据map传入的函数对每行或每列进行转换

Series根据map传入的函数对每行或每列进行转换

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randint(0,10,10))
print(ser_obj)

print(ser_obj.map(lambda x : x ** 2))

显示结果:
Python12--数据分析Pandas库进阶一_第13张图片

5,数据转换-数据替换

replace根据值的内容进行替换

示例代码:

# 导入numpy,别名np
import numpy as np
# 导入pandas,别名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randint(0,10,10))
print(ser_obj)

# 单个值替换单个值
print(ser_obj.replace(1, -100))

# 多个值替换一个值
print(ser_obj.replace([6, 8], -100))

# 多个值替换多个值
print(ser_obj.replace([4, 7], [-100, -200]))

显示结果:
Python12--数据分析Pandas库进阶一_第14张图片

你可能感兴趣的:(Python,数据分析,python,数据分析)