pandas笔记
https://ericfu.me/10-minutes-to-pandas/
import pandas as pd import numpy as np import matplotlib.pyplot as plt
对象:
Series 是一个值的序列,它只有一个列,以及索引(默认整数索引)。DataFrame 是由 Series 组成的
s = pd.Series([1,3,5,np.nan,6,8]) print(s) dates = pd.date_range('20130101', periods=6) print(dates) df = pd.DataFrame(np.random.rand(6,4), index=dates, columns=list('ABCD')) # 随机样本位于[0, 1)中 print(df) df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) # 从标准正态分布中返回一个或多个样本值 print(df) # 如果参数是一个 dict,每个 dict 的 value 会被转化成一个 Series 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' }) print(df2) print(df2.dtypes) # 使用dtypes查看每列的格式 # DataFrame 是由 Series 组成的 print(df2.A) print(df2.D)
输出:
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D') A B C D 2013-01-01 0.780732 0.124204 0.235305 0.529001 2013-01-02 0.171810 0.906791 0.857776 0.854472 2013-01-03 0.800889 0.393307 0.957448 0.083007 2013-01-04 0.554059 0.285796 0.335702 0.516494 2013-01-05 0.019312 0.316769 0.438297 0.127745 2013-01-06 0.866386 0.998849 0.032653 0.295043 A B C D 2013-01-01 -0.316313 1.135091 -1.780023 -0.874327 2013-01-02 0.692177 1.516183 0.135009 0.925807 2013-01-03 -1.176592 0.704903 0.605990 -0.489369 2013-01-04 -0.355686 1.840195 -0.574017 0.910786 2013-01-05 0.272538 1.148157 0.499239 -1.038058 2013-01-06 -0.151837 -1.387401 1.464626 -0.422320 A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object 0 1.0 1 1.0 2 1.0 3 1.0 Name: A, dtype: float64 0 3 1 3 2 3 3 3 Name: D, dtype: int32
Series属性:
obj=pd.Series(['c','a','d','a','a','b','b','c','c','c']) obj.unique() obj.value_counts() obj.isin(['a','b'])
df = pd.DataFrame({
'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
'col2' : [2, 1, 9, 8, 7, 4],
'col3' : [0, 1, 9, 4, 2, 3]})
print (df.groupby('col1').count()) # 按照col1列进行聚合
print(type(df.groupby('col1')['col1'].count())) # <class 'pandas.core.series.Series'>
print (df.groupby('col1')['col1'].count())
df.groupby('col1')['col1'].count().sort_values()
输出:
col2 col3 col1 A 2 2 B 1 1 C 1 1 D 1 1 col1 A 2 B 1 C 1 D 1 Name: col1, dtype: int64 col1 B 1 C 1 D 1 A 2 Name: col1, dtype: int64
dataframe属性:
df = pd.DataFrame({ 'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'], 'col2' : [2, 1, 9, 8, 7, 4], 'col3' : [0, 1, 9, 4, 2, 3]}) df.sort_values(by='col2') # 按照指定列进行排序,默认升序
df.sort_values(by='col2', ascending=False)
查看数据:
# 用 head 和 tail 查看顶端和底端的几列 df.head() df.head(2) df.tail(3) # 查看 index 和 columns df.index df.columns # describe() 显示数据的概要 df.describe() # 转置 df.T # 对 特定axis 按照 index 排序(axis=1 是指第二个维度,即:列) df.sort_index(axis=1, ascending=False) # 按value排序 df.sort_values(by='B')
选择数据:
# 从 DataFrame 选择一个列,得到Series,只有index属性.不能用这种方式选择一行 df['A'] # 选择前三行.这种方式不能用于选择列 df[0:3] df['20130101':'20130103'] # 选择特定行 df.loc['20130104'] # 输出的是series,只有index属性,没有columns属性
通过label选择:loc
# 选择所有行对应A,B两列 df.loc[:, ['A', 'B']] # 选择三行两列 df.loc['20130102':'20130104',['A','B']] # DataFrame # 当有一个维度是标量(而不是范围或序列)的时候,选择出的矩阵维度会减少 df.loc['20130102',['A','B']] # Series # 如果对所有的维度都写了标量,就是选出一个元素.这种情况通常用 at ,速度更快 df.loc[dates[0],'A'] df.at[dates[0],'A']
通过整数下标选择: iloc
# 选择第三行 df.iloc[3] # 选择第三列 df.iloc[:, 3] # 选择 3~4 行,0~1 列 df.iloc[3:5,0:2] # 使用列表进行选择 df.iloc[[1,2,4],[0,2]] # 选择1~2行,所有列 df.iloc[1:3,:] # 选择单个元素 df.iloc[1,1] df.iat[1,1]
bool值下标:
df[df.A > 0] df[df > 0] # isin() 函数:是否在集合中 df2 = df.copy() df2['E'] = ['one', 'one','two','three','four','three'] df2[df2['E'].isin(['two', 'four'])]
缺失值:
df.dropna() #删除所有有NA值的行,有更复杂的用法,后续学习 df.fillna(value=5) pd.isnull(df)
dataframe操作:
# mean函数 # 按列求平均值,每一列对应一个值 df.mean() # 按行求平均值 df.mean(1) # apply函数 df.apply(lambda x: x.max() - x.min()) # x 是一列对应的series # value_counts函数: 统计直方图📊 df['A'].value_counts() # 字符串函数 s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) s.str.lower() # merge操作 df = pd.DataFrame(np.random.randn(10, 4)) # concat函数:按行拼接 pieces = [df[3:7], df[:3], df[7:]] pd.concat(pieces) # 按照指定key进行join left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]}) right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]}) pd.merge(left, right, on='key') print(df) # append: 向 DataFrame 增加新的数据行 s = df.iloc[3] df.append(s, ignore_index=True) # group操作 df.groupby('A')
# 查看分组
df.groupby('A').groups
# 对于groupby的结果,可以直接遍历
for key, val in df.groupby('A'):
print key, val
# 对分组数据进行聚合操作
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print (grouped.groups)
print (grouped['Points'].agg(np.mean))
print (grouped.agg(np.size)) #查看每个分组大小
print (grouped['Points'].agg([np.sum, np.mean, np.std])) # 一次应用多个聚合函数
print (df.groupby('Team').filter(lambda x: len(x) >= 3)) # 过滤
# 可以对两列进行 Group by 并求和 df.groupby(['A','B']).sum()
# 设置某一列的类型:astype
df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
df["grade"] = df["raw_grade"].astype("category")
# 对于 DataFrame,直接 plot df = pd.DataFrame(np.random.randn(1000, 4), columns=['A', 'B', 'C', 'D']) df = df.cumsum() plt.figure(); df.plot(); plt.legend(loc='best') # 读取写入数据 # 写入csv df.to_csv('foo.csv') pd.read_csv('foo.csv')
apply,map,applymap的应用:https://blog.csdn.net/maymay_/article/details/80229053
map() 是一个Series的函数,DataFrame结构中没有map()。map()将一个自定义函数应用于Series结构中的每个元素(elements)。
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'], 'key2' : ['one', 'two', 'one', 'two', 'one'], 'data1' : np.arange(5), 'data2' : np.arange(5,10)}) df['data1'] = df['data1'].map(lambda x : "%.3f"%x)
apply()将一个函数作用于DataFrame中的每个行或者列
# 用apply来对列data1,data2进行相加 df['total'] = df[['data1', 'data2']].apply(lambda x : x.sum(),axis=1 )
applymap()将函数作用于DataFrame中的所有元素(elements)
def addA(x): return "A" + str(x ) df.applymap(addA)
pandas查看数据类型:
df.dtypes
series.dtype
get_dtype_counts()
如果一列中含有多个类型,则该列的类型会是object,同样字符串类型的列也会被当成object类型.
不同的数据类型也会被当成object,比如int32,float32
Seaborn 和 Matplotlib数据可视化
Python 中,数据可视化一般是通过较底层的 Matplotlib 库和较高层的 Seaborn 库实现的,需要导入以下包:
import matplotlib.pyplot as plt import seaborn as sns
在 Jupyter Notebook 中,为了让图片内嵌在网页中,可以打开如下开关:
%matplotlib inline
直方图:
plt.figure(figsize=(12,4))
p = sns.color_palette() sns.barplot(sizes_train.index, sizes_train.values, color=p[0], label='train') plt.legend() plt.xlabel('Number of Ads in display', fontsize=12) plt.ylabel('Proportion of set', fontsize=12)