重要链接:
matplotlib库: matplotlib --- Matplotlib 3.5.1 documentation
DataFrame库 :DataFrame --- pandas 2.2.1 documentation (pydata.org)
Python Matplotlib 实现散点图、曲线图、箱状图、柱状图示例 :Python Matplotlib 实现散点图、曲线图、箱状图、柱状图示例(满足基本的画图需求)_matplotlib实现散点图-CSDN博客
绘图颜色色板 :matplotlib、seaborn颜色、调色板、调色盘。 - 知乎
常用函数:
基础操作合集:
|--------|----------------------------------------------------|
| 获取所有列名 | list(df) df.columns.tolist() list(df.columns) |
| 获取数据类型 | type(df) 如显示:<class 'padas.core.frame.DataFrame> |
| 获取每列类型 | df.dtypes |
Pandas读取某列某行数据------loc、iloc
python
loc:通过行、列的名称或标签来索引
iloc:通过行、列的索引位置来寻找数据
数据:
AA BB CC DD EE
row1 2 3 56 55 4
row2 5 7 4 34 5
row3 9 7 4 7 15
row4 5 72 43 34 5
data1 = data.loc['row2'] #row2一行的值
data1 = data.loc['row2',:] #row2一行的值
data2 = data.loc[ : ,'BB'] #BB一列的值
data3 = data.loc['row1', 'BB'] #row1行BB列对应的值,3
data4 = data.loc['row2':'row3','AA':'DD'] #第2行到第3行,第BB列到第DD列这个区域内的值
data5 = data.loc[ data.BB > 6] #等价于 data5 = data[data.BB > 6] #BB列大于6的每一行数据
data6 = data.loc[ data.BB >6, ["BB","CC","DD"]] #切片操作,选择BB CC DD三列区域内BB列大于6的值
data1 = data.iloc[1] #第二行的值,
data1 = data.iloc[1, :] #效果与上面相同
data2 = data.iloc[:, 1] #读取第二列的值
data3 = data.iloc[1, 1] # 读取第二行,第二列的值
data4 = data.iloc[1:3, 2:4] #左闭右开切片操作,第2、3行,第3、4列值
Python、Numpy和Pandas数据类型:
Python中的str和Numpy中的string、unicode(字符编码),在Pandas中都表示为object,也就是字符串在Pandas中的类型为object。
datetime数据类型转换:
python
#object转为datatime
df = pd.DataFrame({'date': ['2011-04-24 01:30:00.000']})
df['date'] = pd.to_datetime(df['date'])
#打印结果
0 2011-04-24 01:30:00
Name: date, dtype: datetime64[ns]
#datatime转为非时间数据
df['date'] = df['date'].astype('object')
#打印结果
0 2011-04-24 01:30:00
Name: date, dtype: object
#如果字符串格式不正规,可以通过format转换
pd.to_datetime("20110424 01:30:00.000", format='%Y%m%d %H:%M:%S.%f')
时间补全、重采集resample()函数:
采样频率:python时序分析之重采集(resample) - 知乎
resampling采样相关算法、属性:Resampling --- pandas 2.2.1 documentation (pydata.org)
python
按照一分钟的频率将时间补全,mean()将补齐的时间数据识别为NaN
#ffill()方法使用前面的值来填充缺失的值,interpolate()是使用插值法补全,bfill()是向后补全
df=df.resample('1T').mean().ffill()
#获得五分钟为间隔的数据,asfreq()也可以换成其他,如first()
df5=df.resample('5T').asfreq()
df5=df.loc[::5,:]
pandas.Dataframe.set_index( )函数设置索引:
python
索引设置
df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
-keys:列标签或列标签/数组列表,需要设置为索引的列
-drop:默认为True,删除用作新索引的列
-append:是否将列附加到现有索引,默认为False。
-inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
-verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能,默认为false。
pandas.Dataframe.reset_index()函数重置索引:
python
将索引列变为普通数据列
drop: 重新设置索引后是否将原索引作为新的一列并入DataFrame,默认为False
inplace: 是否在原DataFrame上改动,默认为False
level: 如果索引(index)有多个列,仅从索引中删除level指定的列,默认删除所有列
col_level: 如果列名(columns)有多个级别,决定被删除的索引将插入哪个级别,默认插入第一级
col_fill: 如果列名(columns)有多个级别,决定其他级别如何命名
import pandas as pd
import numpy as np
df = pd.DataFrame([('bird', 389.0), ('bird', 24.0), ('mammal', 80.5), ('mammal', np.nan)],
index=['falcon', 'parrot', 'lion', 'monkey'], columns=('class', max_speed'))
#图1
print(df)
#图2
df1 = df.reset_index()
print(df1)
#图3
df2 = df.reset_index(drop=True)
print(df2)
pandas.Dataframe.rename()函数:
python
用来修改Dataframe数据的行名和列名。
columns:列名
index:行名
axis:指定坐标轴
inplace:是否替换,默认为False。inplace为False时返回修改后结果,变量自身不修改。inplace为True时返回None,变量自身被修改。
>>> import pandas as pd
>>> df
A B
0 1 4
1 2 5
2 3 6
# 方法一:不用axis修改。使用方法为df.rename(columns={"旧列名": "新列名"})
>>> df.rename(columns={"A": "a", "B": "c"}) # 修改columns。inplace未设置,返回修改后的结果
a c
0 1 4
1 2 5
2 3 6
>>> df # inplace未设置,默认为false,则df自身不被改变
A B
0 1 4
1 2 5
2 3 6
>>> df_re=df.rename(columns={"A": "a", "B": "c"},index={0:"0a",1:"1a"}) # 同时修改行名和列名
>>> df_re
a c
0a 1 4
1a 2 5
2 3 6
# 方法二:用axis修改,只修改行名列名之一时等价,无法同时修改
>>> df.rename({1: 2, 2: 4}, axis='index') # 修改行名,1改成2,2改成4
A B
0 1 4
2 2 5
4 3 6
>>> df.rename(str.lower, axis='columns') # 列名大写变小写
a b
0 1 4
1 2 5
2 3 6
绘图函数:
plt.annotate()函数:
用于在图中标注文字,需要用循环配合,一个点一个点的标记。
曲线中异常点/特征点的标记方法。
参考:https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.pyplot.annotate.html
python
#参数
#s 为注释文本内容
#xy 为被注释的坐标点
#xytext 为注释文字的坐标位置;
#weight 设置字体线型;color 设置字体颜色;arrowprops 箭头参数,参数类型为字典dict;bbox给标题增加外框
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 6)
y = x * x
#图1
plt.plot(x, y, marker='o')
for xy in zip(x, y):
plt.annotate("(%s,%s)" %(x,y), xy=xy, xytext=(-20, 10), textcoords='offset points')
plt.show()
#图2
ax.annotate('data = (%.1f, %.1f)'%(xdata, ydata),
(xdata, ydata), xytext=(-2*offset, offset), textcoords='offset points',
bbox=bbox, arrowprops=arrowprops)
#图3,上述用于标注文字,但如果想把特殊的坐标用点标示出来可以结合散点图函数
x1=list()
y1=list()
plt.plot(x, y, marker='o')
for xy in zip(x, y):
if x>3:
plt.annotate("(%s,%s)" %(x,y), xy=xy, xytext=(-20, 10), textcoords='offset points')
x1.append(x)
y1.append(y)
plt.scatter(x1,y1,marker="p',color='m'))