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
View Code

 

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)

 

posted @ 2019-03-01 18:30  合唱团abc  阅读(217)  评论(0编辑  收藏  举报