Pandas 概述 NumPy 能够帮助我们处理数值,但 Pandas 除了处理数值之外(基于 NumPy),还能够帮助我们处理其他类型的数据。
Series Series 的创建 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import stringt = pd.Series(np.arange(10 ), index=list (string.ascii_uppercase[:10 ])) a = {string.ascii_uppercase[i]: i for i in range (10 )} pd.Series(a) pd.Series(a, index=list (string.ascii_uppercase[5 :15 ]))
重新指定索引后,如果能够对应上就取其值,不能则为 NaN。类型变为 float 是因为 NumPy 中 nan 为 float,Pandas 会自动根据数据更改 Series 的 dtype 类型。
Series 切片和索引 切片:直接传入 start、end 或步长即可。
索引:一个的时候直接传入序号或 index,多个的时候传入序号或 index 的列表。
1 2 3 4 5 6 7 8 t = pd.Series(np.arange(10 ), index=list ("ABCDEFGHIJ" )) t[2 :10 :2 ] t[1 ] t[[2 , 3 , 6 ]] t[t > 4 ] t["F" ] t[["A" , "F" , "g" ]]
Series 的索引和值 Series 对象本质上由两个数组构成:一个构成对象的键(index),一个构成对象的值(values)。
1 2 3 4 5 t.index t.values type (t.index) type (t.values)
ndarray 的很多方法都可以运用于 Series 类型,比如 argmax、clip。
tolist() 和 unique() 1 2 3 4 df = pd.Series([1 , 2 , 1 , 3 , 2 , 1 ]) df.tolist() df.unique()
读取外部数据 1 2 pd.read_csv(filepath) pd.read_sql(sql_sentence, connection)
DataFrame DataFrame 的创建 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 t = pd.DataFrame(np.arange(12 ).reshape(3 , 4 ), index=list ("ABC" ), columns=list ("WXYZ" )) t_dict = { "name" : ["zhangsan" , "lisi" ], "age" : [12 , 20 ], } pd.DataFrame(t_dict) t_dict = [ {"name" : "zhangsan" , "age" : 12 }, {"name" : "lisi" , "age" : 20 }, ] pd.DataFrame(t_dict)
DataFrame 的基础属性和整体情况查询 1 2 3 4 5 6 7 8 9 10 11 12 13 df.shape df.dtypes df.ndim df.index df.columns df.values df.head(3 ) df.tail(3 ) df.info() df.describe()
对某一列进行排序 1 2 df.sort_values(by="Count_AnimalName" , ascending=False )
DataFrame 取行或列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 df = pd.DataFrame(np.arange(56 ).reshape(7 , 8 ), index=list ("ABCDEFG" ), columns=list ("STUVWXYZ" )) df["X" ] df[["X" , "Z" ]] df[2 :6 ] df[2 :6 ]["X" ]
loc 和 iloc
df.loc:通过标签索引行数据
df.iloc:通过位置获取行数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 df.loc["A" , "W" ] df.loc["A" , ["W" , "Z" ]] df.loc[["A" , "C" ], ["W" , "Z" ]] df.loc["A" :"C" , ["W" , "Z" ]] df.iloc[1 :3 , [2 , 3 ]] df.iloc[1 :3 , 1 :3 ]
赋值更改数据:
1 2 df.loc["A" , "Y" ] = 100 df.iloc[1 :2 , 0 :2 ] = 200
DataFrame 布尔索引 1 2 3 4 5 6 7 df[df["Count_AnimalName" ] > 800 ] df[(df["Row_Labels" ].str .len () > 4 ) & (df["Count_AnimalName" ] > 700 )]
缺失数据的处理 1 2 3 4 5 6 7 8 9 10 11 pd.isnull(df) pd.notnull(df) df.dropna(axis=0 , how='any' , inplace=False ) t.fillna(t.mean()) t.fillna(t.median()) t.fillna(0 )
处理为0的数据:t[t == 0] = np.nan
注意:并不是每次为0的数据都需要处理。计算平均值等情况,nan 不参与计算,但0会。
常用统计方法 1 2 3 4 5 6 7 8 9 10 11 12 13 rating_mean = df["Rating" ].mean() temp_list = df["Actors" ].str .split("," ).tolist() nums = set ([i for j in temp_list for i in j]) max_runtime = df["Runtime(Minutes)" ].max () max_runtime_index = df["Runtime(Minutes)" ].argmax() min_runtime = df["Runtime(Minutes)" ].min () min_runtime_index = df["Runtime(Minutes)" ].argmin() runtime_median = df["Runtime(Minutes)" ].median()
数据合并 join 默认情况下把行索引相同的数据合并到一起。
merge 按照指定的列把数据按照一定的方式合并到一起。
1 t1.merge(t2, left_on="O" , right_on="X" )
合并方式(how 参数):
分组和聚合 1 grouped = df.groupby(by="columns_name" )
grouped 是一个 DataFrameGroupBy 对象,是可迭代的。grouped 中的每一个元素是一个元组,元组里面是(索引(分组的值),分组之后的 DataFrame)。
对多列进行分组:
1 grouped = df.groupby(by=[df["Country" ], df["State/Province" ]])
获取分组之后的某一部分数据:
1 df.groupby(by=["Country" , "State/Province" ])["Country" ].count()
对某几列数据进行分组:
1 df["Country" ].groupby(by=[df["Country" ], df["State/Province" ]]).count()
返回 DataFrame 类型:
1 2 t1 = df[["Country" ]].groupby(by=[df["Country" ], df["State/Province" ]]).count() t2 = df.groupby(by=["Country" , "State/Province" ])[["Country" ]].count()
索引和复合索引 简单的索引操作:
1 2 3 4 5 df.index df.index = ['x' , 'y' ] df.reindex(list ("abcedf" )) df.set_index("Country" , drop=False ) df.set_index("Country" ).index.unique()
复合索引:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 a = pd.DataFrame({ 'a' : range (7 ), 'b' : range (7 , 0 , -1 ), 'c' : ['one' , 'one' , 'one' , 'two' , 'two' , 'two' , 'two' ], 'd' : list ("hjklmno" ) }) x = a.set_index(["c" , "d" ])["a" ] x["one" , "h" ]
交换复合索引:
时间序列 时间序列的生成 1 pd.date_range(start=None , end=None , periods=None , freq='D' )
start 和 end 以及 freq 配合能够生成范围内以频率 freq 的一组时间索引
start 和 periods 以及 freq 配合能够生成从 start 开始的频率为 freq 的 periods 个时间索引
频率缩写:
在 DataFrame 中使用时间序列 1 2 index = pd.date_range("20170101" , periods=10 ) df = pd.DataFrame(np.random.rand(10 ), index=index)
把时间字符串转化为时间序列:
1 df["timeStamp" ] = pd.to_datetime(df["timeStamp" ], format ="" )
format 参数大部分情况下可以不用写,但对于 Pandas 无法格式化的时间字符串(比如包含中文),可以使用该参数。
重采样 重采样:将时间序列从一个频率转化为另一个频率进行处理。将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样。
1 2 3 4 5 6 7 8 t.resample("M" ).mean() t.resample("10D" ).count() t.resample("QS-JAN" ).count()
PeriodIndex DatetimeIndex 可以理解为时间戳,PeriodIndex 可以理解为时间段。
1 2 3 4 5 6 7 periods = pd.PeriodIndex( year=data["year" ], month=data["month" ], day=data["day" ], hour=data["hour" ], freq="H" )