DataFrame是一个表格型的数据结构,它含有一组有序的,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引。
代码如下:
import pandas as pd
import numpy as np
frame=pd.DataFrame(np.random.randn(3,3),index=list('abc'),columns=list('ABC'))
frame
输出结果:
A B C
a -0.391570 0.182729 1.010572
b 0.455405 0.418206 0.134341
c -0.491456 -0.527641 0.868909
代码如下:
import pandas as pd
import numpy as np
frame= pd.DataFrame([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]],
index=list('abc'), columns=list('ABC'))
frame
#可以分别定义列索引(columns)与行切片(index)
frame1=pd.DataFrame([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]])
frame1.columns=list('ABC')
frame1.index=list('abc')
frame1
输出结果:
>>frame
A B C
a 1 2 3
b 2 3 4
c 3 4 5
>>frame1
A B C
a 1 2 3
b 2 3 4
c 3 4 5
代码如下:
import pandas as pd
data={
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame=pd.DataFrame(data)
frame
输出结果:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
代码如下:
frame.dtypes
输出结果:
A float64
B float64
C float64
dtype: object
默认是前5行
代码如下:
frame = pd.DataFrame(np.arange(36).reshape(6, 6), index=list('abcdef'), columns=list('ABCDEF'))
frame.head() #默认是前5行
输出结果:
A B C D E F
a 0 1 2 3 4 5
b 6 7 8 9 10 11
c 12 13 14 15 16 17
d 18 19 20 21 22 23
e 24 25 26 27 28 29
前2行
代码如下:
frame.head(2)
输出结果:
A B C D E F
a 0 1 2 3 4 5
b 6 7 8 9 10 11
默认后5行
代码如下:
frame.tail()
输出结果:
A B C D E F
b 6 7 8 9 10 11
c 12 13 14 15 16 17
d 18 19 20 21 22 23
e 24 25 26 27 28 29
f 30 31 32 33 34 35
后2行
代码如下:
frame.tail(2)
输出结果:
A B C D E F
e 24 25 26 27 28 29
f 30 31 32 33 34 35
代码如下:
frame.columns ##查看列名
输出结果:
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
代码如下:
frame.index ##查看行名
输出结果:
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
代码如下:
frame.values
输出结果:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
代码如下:
print(frame['B'].values)
输出结果:
[ 1 7 13 19 25 31]
代码如下:
frame.iloc[0]
frame.loc['a']
输出结果:
A 0
B 1
C 2
D 3
E 4
F 5
代码如下:
frame.shape[0]
frame.shape[1]
输出结果:
6
6
切片表示是行切片;索引表示是列索引
行
代码如下:
#使用冒号进行切片
>> frame['a':'b']
> A B C D E F
a 0 1 2 3 4 5
b 6 7 8 9 10 11
#借助loc,iloc
#loc
>>frame.loc['a':'c','A':'C'] # ':',切片
> A B C
a 0 1 2
b 6 7 8
c 12 13 14
>>frame.loc[['a','b'],['A','C']] # '[]', 索引特定行列
> A C
a 0 2
b 6 8
#iloc
>>frame.iloc[1:] # 行切片,取第2行之后所有行
> A B C D E F
b 6 7 8 9 10 11
c 12 13 14 15 16 17
d 18 19 20 21 22 23
e 24 25 26 27 28 29
f 30 31 32 33 34 35
>>frame[frame['B']==13].index #显示所有的行名
> Index(['c'], dtype='object')
列
代码如下:
>>frame['A'] #取名为‘A‘的列
> a 0
b 6
c 12
d 18
e 24
f 30
>>frame.loc[:,'A':'C'] #取A-C列
> A B C
a 0 1 2
b 6 7 8
c 12 13 14
d 18 19 20
e 24 25 26
f 30 31 32
>>frame.iloc[:,1] #取第二列
> a 1
b 7
c 13
d 19
e 25
f 31
行+列
代码如下:
>> frame.iloc[1:,-2:] #行:第二行开始 列:倒数第二列开始
> E F
b 10 11
c 16 17
d 22 23
e 28 29
f 34 35
>> frame[frame['A']>7] #A值大于7的所有行
> A B C D E F
c 12 13 14 15 16 17
d 18 19 20 21 22 23
e 24 25 26 27 28 29
f 30 31 32 33 34 35
>> frame['B'][frame['A']>7] # A>7的所有行的'B'信息
> c 13
d 19
e 25
f 31
Name: B, dtype: int32
层次化索引能在一个轴上拥有多个(两个以上)索引级别。
代码如下:
frame=pd.DataFrame(np.arange(12).reshape((4,3)),index=[["a","a","b","b"],[1,2,1,2]],columns=[["apple","apple","avocado"],["red","green","green"]])
frame
输出结果:
apple avocado
red green green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
设置行标签与列标签,代码如下:
frame.index.names=["key1","key2"]
frame.columns.names=["state","color"]
frame
输出结果:
state apple avocado
color red green green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
选取列分组,代码如下:
frame["apple"]
输出结果:
red green
a 1 0 1
2 3 4
b 1 6 7
2 9 10
swaplevel()调整各级别的顺序,代码如下:
frame.swaplevel("key1","key2")
frame.swaplevel(0,1)
输出结果:
state apple avocado
color red green green
key2 key1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
2 b 9 10 11
根据各级别汇总统计,默认为行,代码如下:
frame.sum(level="key2")
输出结果:
state apple avocado
color red green green
key2
1 6 8 10
2 12 14 16
根据各列级别汇总统计,代码如下:
frame.sum(level="color",axis=1)
输出结果:
color red green
key1 key2
a 1 0 3
2 3 9
b 1 6 15
2 9 21
代码如下:
frame.T
输出结果:
a b c d e f
A 0 6 12 18 24 30
B 1 7 13 19 25 31
C 2 8 14 20 26 32
D 3 9 15 21 27 33
E 4 10 16 22 28 34
F 5 11 17 23 29 35
代码如下:
frame.describe()
输出结果:
A B C D E F
count 6.000000 6.000000 6.000000 6.000000 6.000000 6.000000
mean 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000
std 11.224972 11.224972 11.224972 11.224972 11.224972 11.224972
min 0.000000 1.000000 2.000000 3.000000 4.000000 5.000000
25% 7.500000 8.500000 9.500000 10.500000 11.500000 12.500000
50% 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000
75% 22.500000 23.500000 24.500000 25.500000 26.500000 27.500000
max 30.000000 31.000000 32.000000 33.000000 34.000000 35.000000
代码如下:
frame['A'].add(100)
输出结果:
a 100
b 106
c 112
d 118
e 124
f 130
代码如下:
frame['A-B‘]=frame['A'].sub(frame['B'])
frame
输出结果:
A B C D E F A-B
a 0 1 2 3 4 5 -1
b 6 7 8 9 10 11 -1
c 12 13 14 15 16 17 -1
d 18 19 20 21 22 23 -1
e 24 25 26 27 28 29 -1
f 30 31 32 33 34 35 -1
保留两位小数
代码如下:
frame2=pd.DataFrame({
'col1':[1.234,2.34,4.5678],'col2':[1.0987,0.9876,3.45]}) #
frame2.round(2)
输出结果:
col1 col2
0 1.23 1.10
1 2.34 0.99
2 4.57 3.45
不同的列制定不同的小数位数
代码如下:
frame2.round({
'col1':1,'col2':2})
输出结果:
col1 col2
0 1.2 1.10
1 2.3 0.99
2 4.6 3.45
Dataframe与Dataframe之间的相除
代码如下:
import pandas as pd
frame1 = pd.DataFrame([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]],
index=list('abc'), columns=list('ABC'))
import pandas as pd
frame2 = pd.DataFrame([[1, 2, 3],
[2, 6, 8],
[9, 8, 10]],
index=list('abc'), columns=list('ABC'))
frame1.div(frame2)
输出结果:
A B C
a 1.000000 1.0 1.0
b 1.000000 0.5 0.5
c 0.333333 0.5 0.5
Dataframe与Dataframe之间的相除:DataFrame带有缺失值
代码如下:
import pandas as pd
frame1 = pd.DataFrame([[1, 2, None],
[