Dataframe:
dataframe:二维的表格型数据结构,是组合的series。dataframe 的每一行和每一列都是一个series。
语法结构:
DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
data:数组(多维),可迭代对象,字典嵌套或dataframe
index:索引名称,如不传入,则默认[0,1,2…n],传入个数与data的行数相等
columns:列名称,如不传入,则默认[0,1,2…n],传入个数与data的列数相等
DataFrame的生成:
#字典嵌套字典生成dataframe:
import pandas as pd
from pandas import DataFrame
data={"big":{"a":"1","b":"9"},"small":{"a":"4","b":"8"},"middle":{"a":"3","b":"6"}}
frame=pd.DataFrame(data)
print(frame)
#输出:
big small middle
a 1 4 3
b 9 8 6
########################################
#传入ndarray生成dataframe:
data=np.arange(12).reshape(3,4)
frame=DataFrame(data,index=['a','b','c'],columns=['m','n','j','k'])
print(frame)
#输出:
m n j k
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
##########################################
#注意:如果传入1维字典,会出现下面情况:
dic={"a":1,"b":2,"c":3}
DF=pd.DataFrame(dic,index=['m','n','k'])
print(DF)
#输出:
a b c
m 1 2 3
n 1 2 3
k 1 2 3
#可以尝试传入一维数组
Dataframe的主要方法:
- 通过自定义索引和列名顺序修改数据顺序:
import pandas as pd
from pandas import DataFrame
data={"big":{"a":"1","b":"9"},"small":{"a":"4","b":"8"},"middle":{"a":"3","b":"6"}}
origin_frame=pd.DataFrame(data)
new_frame=pd.DataFrame(data,index=['b','a'],columns=['middle','small','big'])
print('origin_frame')
print(origin_frame)
print('new_frame')
print(new_frame)
#输出:
origin_frame
big small middle
a 1 4 3
b 9 8 6
new_frame
middle small big
b 6 8 9
a 3 4 1
- 列索引:frame[‘column_name’],类似字典索引
import pandas as pd
from pandas import DataFrame
data={"big":{"a":"1","b":"9"},"small":{"a":"4","b":"8"},"middle":{"a":"3","b":"6"}}
frame=pd.DataFrame(data)
print(frame['small'])
#输出:
a 4
b 8
Name: small, dtype: object
- 增加列:frame[‘new_column_name’]=data,类似为字典增加值
import numpy as np
import pandas as pd
from pandas import DataFrame
data={"big":{"a":"1","b":"9"},"small":{"a":"4","b":"8"},"middle":{"a":"3","b":"6"}}
frame=pd.DataFrame(data)
frame['very_large']=[100,200]
print(frame)
#输出
big small middle very_large
a 1 4 3 100
b 9 8 6 200
#注意:frame['very_large']=[100,200],直接传入新数据的列表,不可写成rame['very_large']={"a":"100","b":"200"},否则会变成这样:
big small middle very_large
a 1 4 3 a
b 9 8 6 b
- dataframe转置:frame.T #生成的是copy,原frame不变
import numpy as np
import pandas as pd
from pandas import DataFrame
data={"big":{"a":"1","b":"9"},"small":{"a":"4","b":"8"},"middle":{"a":"3","b":"6"}}
frame=pd.DataFrame(data)
print(frame.T)
#输出:
a b
big 1 9
small 4 8
middle 3 6
- 排序:frame.sort_values(by=“column_name”,ascending=True) 只能对列进行排序,默认升序
#sort_values对单列进行排序
import numpy as np
import pandas as pd
from pandas import DataFrame
np.random.seed(123456789)#设置随机数种子
data=np.random.randint(0,30,15).reshape(5,3)
df=DataFrame(data,columns=['a','b','c'])
new_df=df.sort_values(by=['b'])
print(new_df)
#输出:
a b c
2 12 7 26
3 4 15 19
1 25 26 29
0 24 28 18
4 13 28 20
#############################################################################
#sort_values对多列进行排序:
frame.sort_values(by=[column_name_list],ascending=False)
***#注意:多列排序,是指前一列相同的时候。比较后一列,前一列不同,则不管后面***
- frame.rank()排序: rank得出的是值在原数列中的大小顺序
语法:
DataFrame.rank(axis=0, method=‘average’, numeric_only=None, na_option=‘keep’, ascending=True, pct=False)
axis:按哪一条轴排序,0/index 按纵轴排,1/columns按纵轴排
method:method : {‘average’, ‘min’, ‘max’, ‘first’} 默认值 average
average :在相等分组中,为各个值分配平均排名
min :使用整个分组的最小排名
max :使用整个分组的最大排名
first : 按值在原始数据中的出现顺序分配排名
rank是一种综合考量数值大小排名和数值在原序列中出现顺序的排名方法:
如何理解method参数:
例如,原数据索引 2,3 ,6对应的数值都是0,而0是整个序列中的最小值,如果按大小+先后顺序排列,索引2,3,6对应为位置应该是1,2,3
method=‘max’参数的意义就是:当元数据中出现重复值(如例子中的0)的时候,选取重复值在原数据中排名的最大值(3)。
method=‘min’参数的意义就是:当元数据中出现重复值(如例子中的0)的时候,选取重复值在原数据中排名的最小值(1)。
method=‘average’参数的意义就是:当元数据中出现重复值(如例子中的0)的时候,选取重复值在原数据中排名的平均值((1+2+3)/3)。
method=‘average’参数的意义就是:当元数据中出现重复值(如例子中的0)的时候,选取重复值在原数据中排名的先后顺序(1,2,3)。
import numpy as np
import pandas as pd
from pandas import DataFrame
np.random.seed(126767)
data=np.random.randint(0,10,10)
frame=DataFrame(data,columns=['num'])
print('original_num',frame)
print('ranked_average:',frame.rank())
print('ranked_max:',frame.rank(method='max'))
print('ranked_min:',frame.rank(method='min'))
print('ranked_first:',frame.rank(method='first'))
#输出:
original_num num
0 3
1 6
2 0
3 0
4 1
5 2
6 0
7 7
8 9
9 3
ranked_average: num
0 6.5
1 8.0
2 2.0
3 2.0
4 4.0
5 5.0
6 2.0
7 9.0
8 10.0
9 6.5
ranked_max: num
0 7.0
1 8.0
2 3.0
3 3.0
4 4.0
5 5.0
6 3.0
7 9.0
8 10.0
9 7.0
ranked_min: num
0 6.0
1 8.0
2 1.0
3 1.0
4 4.0
5 5.0
6 1.0
7 9.0
8 10.0
9 6.0
ranked_first: num
0 6.0
1 8.0
2 1.0
3 2.0
4 4.0
5 5.0
6 3.0
7 9.0
8 10.0
9 7.0
- 通过行号混合索引:frame.iloc[index_num] 通过行号混合索引
import pandas as pd
data=[[2,3,4],[5,6,7]]
index=["d","e"]
columns=["a","b","c"]
df=pd.DataFrame(data,index,columns)
print(df)
print('输出第二行的值:',df.iloc[1])
#输出:
a b c
d 2 3 4
e 5 6 7
输出第二行的值:
a 5
b 6
c 7
- 通过行标签混合索引:frame.loc[index_name] 通过行号混合索引
import pandas as pd
data=[[2,3,4],[5,6,7]]
index=["d","e"]
columns=["a","b","c"]
df=pd.DataFrame(data,index,columns)
print(df)
print('输出第二行的值:',df.loc['e'])
#输出:
a b c
d 2 3 4
e 5 6 7
输出第二行的值: a 5
b 6
c 7
Name: e, dtype: int64
- 根据行位置切片:frame.iloc([start:top]) :默认左闭又开区间
同frame([start:top])
import pandas as pd
import numpy as np
from pandas import DataFrame
data=np.random.randint(0,15,15).reshape(5,3)
frame=DataFrame(data,index=['a','b','c','d','e'])
print('选取第二到第四列:',frame.iloc[1:4])
#输出:
选取第二到第四列:
0 1 2
b 9 11 14
c 13 4 11
d 4 3 1
10.根据行名称切片:frame.loc[‘start_index_name’:‘stop_index_name’], 双闭区间
import pandas as pd
import numpy as np
from pandas import DataFrame
data=np.random.randint(0,15,15).reshape(5,3)
frame=DataFrame(data,index=['a','b','c','d','e'])
print('选取第二到第五列:',frame.loc['b':'d'])
#输出:
选取第二到第五列:
0 1 2
b 11 14 12
c 9 6 8
d 1 9 9
- 截取块行切片和列索引混合使用:
data=np.random.randint(0,15,15).reshape(5,3)
frame=DataFrame(data,index=['a','b','c','d','e'],columns=['x','y','z'])
print('选取中间三行和后两列:',frame[1:4][['y','z']])
#输出:
选取中间三行和后两列:
y z
b 2 3
c 3 8
d 0 3
###########注意:列不可以像行一样切片,只能传入需要的列的列名列表###########
- 定位单个数据:frame.at[index_name,column_name]
np.random.seed(38754)
data=np.random.randint(0,15,15).reshape(5,3)
frame=DataFrame(data,index=['a','b','c','d','e'],columns=['x','y','z'])
print('选取b行和y列数据:',frame.at['b','y'])
#输出:
选取b行和y列数据: 12
- 定位单个数据:frame.iat[index_num,column_num]
print('选取b行和y列数据:',frame.iat[3,2])
#输出:
选取3行2列的数据: 0
- 判断轴索引是否唯一:frame.index.is_unique
np.random.seed(126767)
data=np.random.randint(0,15,15).reshape(5,3)
frame=DataFrame(data,index=['a','b','a','c','b'])
print(frame.index.is_unique)
#输出:
False