Pandas

作者: 许志辉Albert | 来源:发表于2021-01-10 15:43 被阅读0次

Pandas

1.1 构造和初始化Series

import pandas as pd
pd.__version__ #查看版本

s = pd.Series([7, 'Beijing', 2.17, -12344, 'Happy Birthday!'])
s
输出结果

0 7
1 Beijing
2 2.17
3 -12344
4 Happy Birthday!
dtype: object

pandas会默认用0到n-1来作为Series的index,但是我们也可以自己指定index。index我们可以把它理解为dict里面的key。

还可以用dictionary来构造一个Series,因为Series本来就是key value pairs。

cities = {'Beijing': 55000, 'Shanghai': 60000, 'Shenzhen': 50000, 'Hangzhou': 20000, 'Guangzhou': 25000, 'Suzhou': None}
apts = pd.Series(cities, name="price")
apts
输出结果

Beijing 55000.0
Shanghai 60000.0
Shenzhen 50000.0
Hangzhou 20000.0
Guangzhou 25000.0
Suzhou NaN
Name: price, dtype: float64

numpy ndarray构建一个Series
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
输出结果

a -1.480891
b 0.315682
c 0.109896
d -0.963698
e 0.834620
dtype: float64

1.2 选择数据

我们可以像对待一个list一样对待Series
Series就像一个dict,前面定义的index就是用来选择数据的

1.3 Series元素赋值

1.4数学运算

广播特性(类似ndarray 但是要求index要对齐)

1.5创建DataFrame

import pandas as pd
data = {'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou', 'Chongqing'],
       'year': [2016,2017,2016,2017,2016, 2016],
       'population': [2100, 2300, 1000, 700, 500, 500]}
pd.DataFrame(data)
输出结果

city year population
0 Beijing 2016 2100
1 Shanghai 2017 2300
2 Guangzhou 2016 1000
3 Shenzhen 2017 700
4 Hangzhou 2016 500
5 Chongqing 2016 500

columns的名字和顺序可以指定

pd.DataFrame(data, columns=['year', 'city', 'population'])
输出结果:

year city population
0 2016 Beijing 2100
1 2017 Shanghai 2300
2 2016 Guangzhou 1000
3 2017 Shenzhen 700
4 2016 Hangzhou 500
5 2016 Chongqing 500

index也可以指定

frame = pd.DataFrame(data, columns = ['year', 'city', 'population'],
                     index = ['one', 'two', 'three', 'four', 'five', 'six'])
frame
输出结果

**** year city population
one 2016 Beijing 2100
two 2017 Shanghai 2300
three 2016 Guangzhou 1000
four 2017 Shenzhen 700
five 2016 Hangzhou 500
six 2016 Chongqing 500

1.6数据选取(loc &iloc)

a.loc[:,列名]
a.iloc[:,列编号]

1.7CSV文件读取

#读取CSV文件 test,
import pandas as pd
df = pd.read_csv("../data/test.csv")

1.8 缺失值处理

df.isnull() #查看缺失值数量
df.notnull()#查看非缺失值数量
df.fillna(0) #用0填充缺失值
df.dropna() #将df中有缺失值的行都删除

1.9保存数据

#以CSV格式保存test_2文件
df.to_csv('test_2.csv')

1.10删除数据

#删除索引为a b的行
df.drop(['a','b'])
#删除列名为a b的列
df.drop(['a','b',axis = 1 ])

1.11分组/groupby

import pandas as pd
import numpy as np
%matplotlib inline
salaries = pd.DataFrame({
    'Name': ['BOSS', 'Jason', 'Jason', 'Han', 'BOSS', 'BOSS', 'Jason', 'BOSS'],
    'Year': [2016,2016,2016,2016,2017,2017,2017,2017],
    'Salary': [10000,2000,4000,5000,18000,25000,3000,4000],
    'Bonus': [3000,1000,1000,1200,4000,2300,500,1000]
})
salaries
输出结果:

Name Year Salary Bonus
0 BOSS 2016 10000 3000
1 Jason 2016 2000 1000
2 Jason 2016 4000 1000
3 Han 2016 5000 1200
4 BOSS 2017 18000 4000
5 BOSS 2017 25000 2300
6 Jason 2017 3000 500
7 BOSS 2017 4000 1000

#以名字作为维度进行分组
group_by_name = salaries.groupby('Name')
group_by_name

1.12聚合

group_by_name.sum()
输出结果:

**** Year Salary Bonus
Name
BOSS 8067 57000 10300
Han 2016 5000 1200
Jason 6049 9000 2500

也可以对多个columns进行group by

group_by_name_year = salaries.groupby(['Name', 'Year'])
group_by_name_year.sum()
输出结果:
image.png
group_by_name_year.size()
image.png

1.13agg的使用

#agg可以对每一列做不同的聚合操作
group_by_name.agg([np.sum, np.mean, np.std])
输出结果:
image.png
group_by_name.agg({"Bonus": np.sum, "Salary": np.sum, "Year": (lambda x: list(x)[0])})
输出结果:
image.png

1.14 transform vs apply

transform会把group中的每一个record都按照同样的规则转化

import pandas as pd
nvda = pd.read_csv("../data/NVDA.csv", index_col=0, parse_dates=[0])
nvda.head()
image.png
nvda.groupby(nvda.index.year).mean()
image.png
zscore = lambda x:(x-x.mean())/x.std()
transformed = nvda.groupby(nvda.index.year).transform(zscore)
transformed.head()
image.png
用另一个function apply 也可以起到同样的效果
transformed = nvda.groupby(nvda.index.year).apply(zscore)
transformed.head()
image.png

可以把这些数据都画出来

compare = pd.DataFrame({"Original Adj Close": nvda["Adj Close"], 
                        "Transormed Adj Close": transformed["Adj Close"]})
compare.plot()
image.png

1.16 concat VS merge

pd.concat[df1,df2]  #直接对df1 与df2进行暴力拼接
pd.merge(df1,df2,on = 'key' how = 'left) # 对df1 df2 进行做连接 以key为连接字段(类似sql中的left join)




相关文章

网友评论

    本文标题:Pandas

    本文链接:https://www.haomeiwen.com/subject/cdscaktx.html