01字符串离散化的案例
02数据合并
join
join: 默认情况下他是把行索引相同的数据合并到一起
>>> import numpy as np
>>> import pandas as pd
>>> t1 = pd.DataFrame(np.ones((3,4)),index = list("ABC"))
>>> t1
0 1 2 3
A 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0
C 1.0 1.0 1.0 1.0
>>> t2 =pd.DataFrame(np.zeros((2,5)),index=list("AB"),columns=list("VWXYZ"))
>>> t2
V W X Y Z
A 0.0 0.0 0.0 0.0 0.0
B 0.0 0.0 0.0 0.0 0.0
>>> t1.join(t2) #以t1为主
0 1 2 3 V W X Y Z
A 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0
B 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0
C 1.0 1.0 1.0 1.0 NaN NaN NaN NaN NaN
>>> t2.join(t1) #以t2为主
V W X Y Z 0 1 2 3
A 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
B 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
merge
merge: 按照指定的列把数据按照一定的方式合并到一起
默认的合并方式inner,交集
merge outer,并 集,NaN补全
merge left,左边为准,NaN补全
merge right,右边为准,NaN补全
03数据分组聚合
分组和聚合
在pandas中分组的操作:grouped = df.groupby(by=“columns_name”)
grouped是一个DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组
元组里面是(索引(分组的值),分组之后的DataFrame)
如果我们需要对国家和省份进行分组统计,应该怎么操作呢?
grouped = df.groupby(by=[df[“Country”],df[“State/Province”]])
很多时候我们只希望对获取分组之后的某一部分数据,或者说我们只希望对某几列数据进行分组,这个时候我们应该怎么办呢?
获取分组之后的某一部分数据:
df.groupby(by=[“Country”,“State/Province”])[“Country”].count()
对某几列数据进行分组:
df[“Country”].groupby(by=[df[“Country”],df[“State/Province”]]).count()
观察结果,由于只选择了一列数据,所以结果是一个Series类型
如果我想返回一个DataFrame类型呢?
t1 = df[[“Country”]].groupby(by=[df[“Country”],df[“State/Province”]]).count()
t2 = df.groupby(by=[“Country”,“State/Province”])[[“Country”]].count()
以上的两条命令结果一样
和之前的结果的区别在于当前返回的是一个DataFrame类型
04数据的索引
简单的索引操作:
获取index: df.index
指定index : df.index = [‘x’,‘y’]
重新设置index : df.reindex(list(“abcedf”)) #实则是对dataframe进行取行
指定某一列作为index : df.set_index(“Country”,drop=False)
返回index的唯一值: df.set_index(“Country”).index.unique() #drop为假表示之前列充当索引的列名称依然保存
>>> import numpy as np
>>> t = pd.DataFrame(np.ones((3,4)),index = list("ABC"))
>>> t
0 1 2 3
A 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0
C 1.0 1.0 1.0 1.0
>>> t.index
Index(['A', 'B', 'C'], dtype='object')
>>> t.set_index(0)
1 2 3
0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
>>> t.set_index(0,drop=False)
0 1 2 3
0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
>>> t1=t.set_index(0,drop=False)
>>> t1
0 1 2 3
0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
>>> t1[0][1.0]=100
>>> t1
0 1 2 3
0
100.0 100.0 1.0 1.0 1.0
100.0 100.0 1.0 1.0 1.0
100.0 100.0 1.0 1.0 1.0
>>> t1[1].unique()
array([1.])
>>> t1[0].unique()
array([100.])
Series复合索引
假设a为一个DataFrame,那么当a.set_index([“c”,“d”])即设置两个索引的时候是什么样子的结果呢?
Series的复合索引取值,直接在括号中写索引就可以了
>>> a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c': ['one','one','one','two','two','two', 'two'],'d': list("hjklmno")})
>>> a
a b c d
0 0 7 one h
1 1 6 one j
2 2 5 one k
3 3 4 two l
4 4 3 two m
5 5 2 two n
6 6 1 two o
>>> b= a.set_index(['c','d'])
>>> b
a b
c d
one h 0 7
j 1 6
k 2 5
two l 3 4
m 4 3
n 5 2
o 6 1
c = b["a"]
>>> c
c d
one h 0
j 1
k 2
two l 3
m 4
n 5
o 6
Name: a, dtype: int64
>>> type(c)
<class 'pandas.core.series.Series'>
>>> c["one"]['j']
1
>>> c['one']
d
h 0
j 1
k 2
Name: a, dtype: int64
swaplevel() level相当于复合索引的里外层,交换了level之后,里外交换
>>> c.swaplevel()
d c
h one 0
j one 1
k one 2
l two 3
m two 4
n two 5
o two 6
Name: a, dtype: int64
>>> c.swaplevel()['h']
c
one 0
Name: a, dtype: int64
DataFrame复合索引
>>> d= a.set_index(['d','c'])
>>> d
a b
d c
h one 0 7
j one 1 6
k one 2 5
l two 3 4
m two 4 3
n two 5 2
o two 6 1
>>> d.index
MultiIndex([('h', 'one'),
('j', 'one'),
('k', 'one'),
('l', 'two'),
('m', 'two'),
('n', 'two'),
('o', 'two')],
names=['d', 'c'])
>>> d.index.levels
FrozenList([['h', 'j', 'k', 'l', 'm', 'n', 'o'], ['one', 'two']])
>>> d.swaplevel()
a b
c d
one h 0 7
j 1 6
k 2 5
two l 3 4
m 4 3
n 5 2
o 6 1
>>> d.swaplevel().loc['one']
a b
d
h 0 7
j 1 6
k 2 5
>>> b
a b
c d
one h 0 7
j 1 6
k 2 5
two l 3 4
m 4 3
n 5 2
o 6 1
>>> b.loc['one'].loc['h']
a 0
b 7
Name: h, dtype: int64
>>> b.swaplevel().loc['h']
a b
c
one 0 7