Pandas库相关知识
一、概述
引用菜鸟教程上的一段话:
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
二、具体使用
1、基础使用
1.1 定义一个序列
s = pd.Series([1, 3, 6, np.nan, 44, 1])
print('-------------------------定义一个序列---------------------------')
print(s)
结果
1.2 定义一个普通的二维序列
s2 = pd.DataFrame(np.arange(12).reshape((3, 4)))
print('-------------------------定义一个普通的二维序列---------------------')
print(s2)
结果
1.3 定义一个时间序列
dates = pd.date_range('20221010', periods=6)
print('-------------------------定义一个时间序列-------------------------')
print(dates)
结果
1.4 自定义一个二维序列
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print('-------------------------自定义一个二维序列------------------------')
print(df)
结果
1.5 重新定义一个序列
df2 = pd.DataFrame({
'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'
})
结果
(1)通过上述序列,获取列的值
print('-------------------------获取列的名字---------------------------')
print(df2.columns)
结果
(2)通过上述序列,获取每一行的值
print('-------------------------获取每一行的值---------------------------')
print(df2.values)
结果
(3)描述数据
print('-------------------------描述数据---------------------------')
print(df2.describe())
结果
(4)反转矩阵
print('-------------------------反转矩阵---------------------------')
print(df2.T)
结果
(5)从左到右倒序排列
print('-------------------------从左到右倒序排列---------------------------')
print(df2.sort_index(axis=1, ascending=False))
结果
(6)从上到下倒序排列
print('-------------------------从上到下倒序排列---------------------------')
print(df2.sort_index(axis=0, ascending=False))
结果
(7)根据某一列的值进行排序
print('-------------------------根据某一列的值进行排列---------------------------')
print(df2.sort_values(by='E'))
结果
1.6 完整代码
import pandas as pd
import numpy as np
s = pd.Series([1, 3, 6, np.nan, 44, 1])
s2 = pd.DataFrame(np.arange(12).reshape((3, 4)))
dates = pd.date_range('20221010', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame({
'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'
})
if __name__ == '__main__':
print('-------------------------定义一个序列---------------------------')
print(s)
print('-------------------------定义一个普通的二维序列---------------------')
print(s2)
print('-------------------------定义一个时间序列-------------------------')
print(dates)
print('-------------------------自定义一个二维序列------------------------')
print(df)
print('-------------------------定义一个新的序列---------------------------')
print(df2)
print('-------------------------获取列的名字---------------------------')
print(df2.columns)
print('-------------------------获取每一行的值---------------------------')
print(df2.values)
print('-------------------------描述数据---------------------------')
print(df2.describe())
print('-------------------------反转矩阵---------------------------')
print(df2.T)
print('-------------------------从左到右倒序排列---------------------------')
print(df2.sort_index(axis=1, ascending=False))
print('-------------------------从上到下倒序排列---------------------------')
print(df2.sort_index(axis=0, ascending=False))
print('-------------------------根据某一列的值进行排列---------------------------')
print(df2.sort_values(by='E'))
2、pandas选择数据
2.1 定义一个二维序列
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df)
结果
(1)找出某一列的信息
print('----------------------------找出A这一列的信息---------------------')
print(df['A'], df.A)
结果
(2)根据序列号找出某几行的信息
print('----------------------------找出这三行的信息方式1-----------------------')
print(df[0:3])
结果
(3)根据index值(标签名)找出某几行信息
print('----------------------------找出这三行的信息方式2---------------------')
print(df['20220102':'20220104'])
结果
(4)对单个标签进行筛选
print('----------------------------对单个标签进行筛选---------------------')
print(df.loc['20220103'])
结果
(5)通过序列号和标签名混合使用
print('----------------------------混合使用---------------------')
print(df.loc[:, ['A', 'B']])
结果
(6)选择某一行的数据
print('----------------------------选择某一行的数据---------------------')
print(df.iloc[3])
结果
(7)选择某一行某一个的数据
print('----------------------------选择某一行某一个的数据---------------------')
print(df.iloc[3,1])
结果
(8)结合切片操作选择数据
print('----------------------------结合切片操作选择数据---------------------')
print(df.iloc[3:5, 1:3])
结果
(9)通过判断来删选数据
print('----------------------------通过判断来筛选数据---------------------')
print(df[df.A < 8])
结果
2.2 完整代码
import pandas as pd
import numpy as np
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
if __name__ == '__main__':
print(df)
print('----------------------------找出A这一列的信息---------------------')
print(df['A'], df.A)
print('----------------------------找出这三行的信息方式1-----------------------')
print(df[0:3])
print('----------------------------找出这三行的信息方式2---------------------')
print(df['20220102':'20220104'])
print('----------------------------对单个标签进行筛选---------------------')
print(df.loc['20220103'])
print('----------------------------混合使用---------------------')
print(df.loc[:, ['A', 'B']])
print('----------------------------选择某一行的数据---------------------')
print(df.iloc[3])
print('----------------------------选择某一行某一个的数据---------------------')
print(df.iloc[3, 1])
print('----------------------------结合切片操作选择数据---------------------')
print(df.iloc[3:5, 1:3])
print('----------------------------通过判断来筛选数据---------------------')
print(df[df.A < 8])
3、pandas设置值
3.1 定义一个二维序列
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df)
结果
(1)通过序列号改变某一位的值
print('--------------------通过序列号改变某一位的值---------------------')
df.iloc[2, 2] = 1111
print(df)
结果
(2)通过标签改变某一位的值
print('--------------------通过标签改变某一位的值---------------------')
df.loc['20220103', 'B'] = 2222
print(df)
结果
(3)通过判断条件改变值
print('--------------------通过判断结果改变值---------------------')
df[df.A > 4] = 0
print(df)
结果
(4)通过判断条件改变某一列的值
print('--------------------通过判断结果改变某一列的值---------------------')
df.A[df.A > 4] = 0
print(df)
结果
(5)增加某一列
print('--------------------增加某一列---------------------')
df['E'] = np.nan
print(df)
结果
(6)自定义增加某一列
print('--------------------自定义增加某一列---------------------')
df['F'] = pd.Series([1,2,3,4,5,6],index=pd.date_range('20220101',periods=6))
print(df)
结果
3.2 完整代码
import pandas as pd
import numpy as np
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
if __name__ == '__main__':
print(df)
print('--------------------通过序列号改变某一位的值---------------------')
df.iloc[2, 2] = 1111
print(df)
print('--------------------通过标签改变某一位的值---------------------')
df.loc['20220103', 'B'] = 2222
print(df)
# print('--------------------通过判断结果改变值---------------------')
# df[df.A > 4] = 0
# print(df)
print('--------------------通过判断结果改变某一列的值---------------------')
df.A[df.A > 4] = 0
print(df)
print('--------------------增加某一列---------------------')
df['E'] = np.nan
print(df)
print('--------------------自定义增加某一列---------------------')
df['F'] = pd.Series([1,2,3,4,5,6],index=pd.date_range('20220101',periods=6))
print(df)
4、pandas处理丢失数据
4.1 定义一个二维序列并将某两个数据赋值为nan
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df.iloc[0, 1] = np.nan
df.iloc[1, 2] = np.nan
结果
(1)将数值为nan的行给删除
print('--------------------将数值为nan的行给删除-----------------------')
print(df.dropna(axis=0, how='any'))
结果
(2)将值为nan的值填充为0
print('--------------------将数值为nan的值填充为0-----------------------')
print(df.fillna(value=0))
结果
(3)判断数据是否为null
print('--------------------判断数据是否数值为nan-----------------------')
print(df.isnull())
结果
(4)判断数据是否存在值为nan的数据
print('--------------------判断数据是否存在值为nan的数据-----------------------')
print(np.any(df.isnull()) == True)
结果
4.2 完整代码
import pandas as pd
import numpy as np
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df.iloc[0, 1] = np.nan
df.iloc[1, 2] = np.nan
if __name__ == '__main__':
print(df)
print('--------------------将数值为nan的行给删除-----------------------')
print(df.dropna(axis=0, how='any'))
print('--------------------将数值为nan的值填充为0-----------------------')
print(df.fillna(value=0))
print('--------------------判断数据是否数值为nan-----------------------')
print(df.isnull())
print('--------------------判断数据是否存在值为nan的数据-----------------------')
print(np.any(df.isnull()) == True)
5、pandas导入导出
5.1 读取csv表
#读取csv表
data = pd.read_csv('doc/test.csv')
结果
5.2 保存数据
#保存数据为pickle
data.to_pickle('doc/test.pickle')
结果
5.3 完整代码
import pandas as pd
data = pd.read_csv('doc/test.csv')
if __name__ == '__main__':
print(data)
data.to_pickle('doc/test.pickle')
6、pandas合并操作(concat)
6.1 定义三个二维序列
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['a', 'b', 'c', 'd'])
df3 = pd.DataFrame(np.ones((3, 4)) * 2, columns=['a', 'b', 'c', 'd'])
结果
(1)concat合并后的效果
print('------------------------------合并后的效果------------------------')
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
print(res)
结果
6.2 定义两个新的二维序列
df4 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df5 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['b', 'c', 'd', 'e'], inde
结果
(1)inner合并
print('-----------------------------inner合并-------------------------')
res = pd.concat([df4, df5], join='inner', ignore_index=True)
print(res)
结果
(2)从左到右合并
print('-----------------------------从左到右合并,指定合并的方式-------------------------')
res2 = pd.concat([df4, df5], axis=1)
print(res2)
结果
(3)使用append单个添加,默认从上到下合并
print('-----------------------------使用append,默认从上到下合并-------------------------')
res2 = df1.append(df2, ignore_index=True)
print(res2)
结果
(4)使用append多个添加,默认从上到下合并
print('-----------------------------使用append多个合并,默认从上到下合并-------------------------')
res2 = df1.append([df2, df3], ignore_index=True)
print(res2)
结果
(5)使用append添加一行数据
print('-----------------------------使用append,添加一行数据-------------------------')
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
res2 = df1.append(s1, ignore_index=True)
print(res2)
结果
6.3 完整代码
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['a', 'b', 'c', 'd'])
df3 = pd.DataFrame(np.ones((3, 4)) * 2, columns=['a', 'b', 'c', 'd'])
df4 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df5 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
if __name__ == '__main__':
print(df1)
print(df2)
print(df3)
print('------------------------------合并后的效果------------------------')
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
print(res)
print('------------------------------组合2------------------------')
print(df4)
print(df5)
print('-----------------------------inner合并-------------------------')
res = pd.concat([df4, df5], join='inner', ignore_index=True)
print(res)
print('-----------------------------从左到右合并,指定合并的方式-------------------------')
res2 = pd.concat([df4, df5], axis=1)
print(res2)
print('-----------------------------使用append,默认从上到下合并-------------------------')
res2 = df1.append(df2, ignore_index=True)
print(res2)
print('-----------------------------使用append多个合并,默认从上到下合并-------------------------')
res2 = df1.append([df2, df3], ignore_index=True)
print(res2)
print('-----------------------------使用append,添加一行数据-------------------------')
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
res2 = df1.append(s1, ignore_index=True)
print(res2)
7、pandas合并二(merge)
7.1 定义两个二维序列(场景1)
left = pd.DataFrame({
'key': ['k0', 'k1', 'k2', 'k3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
})
right = pd.DataFrame({
'key': ['k0', 'k1', 'k2', 'k3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
})
结果
(1)merge合并
print('------------------------------merge合并--------------------------------')
res = pd.merge(left, right, on='key')
print(res)
结果
7.2 重新定义两个序列(场景2)
left2 = pd.DataFrame({
'key': ['k0', 'k0', 'k1', 'k2'],
'key2': ['k0', 'k1', 'k0', 'k1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
})
right2 = pd.DataFrame({
'key': ['k0', 'k1', 'k1', 'k2'],
'key2': ['k0', 'k0', 'k0', 'k0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
})
结果
(1)根据多个条件进行merge合并
print('------------------------------根据多个条件,进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'])
print(res2)
结果
(2)outer进行merge合并
print('------------------------------outer进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'], how='outer')
print(res2)
结果
(3)right进行merge合并
print('------------------------------right进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'], how='right')
print(res2)
结果
7.3 再次定义两个二维序列(场景3)
df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]})
print(df1)
print(df2)
结果
(1)进行right合并时,显示合并策略
print('------------------------------显示合并操作--------------------------------')
res3 = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
print(res3)
结果
(2)修改合并策略的字段名
print('--------------------------------修改合并策略的字段名------------------------------')
res3 = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
print(res3)
结果
7.4 之后定义两个二维序列(场景4)
left3 = pd.DataFrame({
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
},
index=['k0', 'k1', 'k2']
)
right3 = pd.DataFrame({
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
},
index=['k0', 'k2', 'k3']
)
结果
(1)根据index来进行merge合并
print('--------------------------------index合并------------------------------')
res4 = pd.merge(left3, right3, left_index=True, right_index=True, how='outer')
print(res4)
结果
7.5 最后定义两个二维序列(场景5)
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
print(boys)
print(girls)
结果是
(1)merge合并后增加后缀
print('--------------------------------合并后增加后缀------------------------------')
res5 = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
print(res5)
结果
7.6 完整代码
import pandas as pd
left = pd.DataFrame({
'key': ['k0', 'k1', 'k2', 'k3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
})
right = pd.DataFrame({
'key': ['k0', 'k1', 'k2', 'k3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
})
left2 = pd.DataFrame({
'key': ['k0', 'k0', 'k1', 'k2'],
'key2': ['k0', 'k1', 'k0', 'k1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
})
right2 = pd.DataFrame({
'key': ['k0', 'k1', 'k1', 'k2'],
'key2': ['k0', 'k0', 'k0', 'k0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
})
df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]})
left3 = pd.DataFrame({
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
},
index=['k0', 'k1', 'k2']
)
right3 = pd.DataFrame({
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2'],
},
index=['k0', 'k2', 'k3']
)
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
if __name__ == '__main__':
print(left)
print(right)
print('------------------------------merge合并--------------------------------')
res = pd.merge(left, right, on='key')
print(res)
print(left2)
print(right2)
print('------------------------------根据多个条件,进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'])
print(res2)
print('------------------------------outer进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'], how='outer')
print(res2)
print('------------------------------right进行merge合并--------------------------------')
res2 = pd.merge(left2, right2, on=['key', 'key2'], how='right')
print(res2)
print('------------------------------分割线--------------------------------')
print(df1)
print(df2)
print('------------------------------显示合并操作--------------------------------')
res3 = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
print(res3)
print('--------------------------------修改合并策略的字段名------------------------------')
res3 = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
print(res3)
print('--------------------------------分割线------------------------------')
print(left3)
print(right3)
print('--------------------------------index合并------------------------------')
res4 = pd.merge(left3, right3, left_index=True, right_index=True, how='outer')
print(res4)
print('--------------------------------分割线------------------------------')
print(boys)
print(girls)
print('--------------------------------合并后增加后缀------------------------------')
res5 = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
print(res5)
8、pandas画图(plot)
8.1 单个线性图
# Seris
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
data.plot()
plt.show()
结果
8.2 多个线性图
# DataFrame
data2 = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data2 = data2.cumsum()
data2.plot()
plt.show()
结果
8.3 散点图
ax = data2.plot.scatter(x='A', y='B', color='DarkBlue', label='Class1')
data2.plot.scatter(x='A', y='C', color='DarkGreen', label='Class2', ax=ax)
plt.show()
结果
8.4 完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
# Seris
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
# DataFrame
data2 = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data2 = data2.cumsum()
# data2.plot()
ax = data2.plot.scatter(x='A', y='B', color='DarkBlue', label='Class1')
data2.plot.scatter(x='A', y='C', color='DarkGreen', label='Class2', ax=ax)
plt.show()