DataFrame,中文叫数据框,是pandas模块最常用的数据类型,是一个二维的矩阵数据表。DataFrame,就像是一个表格,可以非常便捷地存放数据。
DataFrame,它由3部分组成:行索引(index),列索引(columns),值。通过index和columns,可以定位到一个值,能快速进行数据的筛选和定位。列和列之间的数据类型可以不同。
可以认为DataFrame是“具有相同index的Series的集合”,和Series类似,DataFrame的行索引index是可以选择性定义的。如果没有定义index,index就会默认从0开始生成。
3.1 导入pandas
import pandas as pd
3.2 创建数据框
df=pd.DataFrame(数据列表或数据字典,index=索引列表)
可以用字典生成数据框或者用列表生成数据框,二者的区别如下:
- 字典生成:字典的key是列名,值是一列数据的值
- 列表生成:列表是一行数据
以下是两个示例:
#用字典生成dataframe
import pandas as pd
data={'rank':[1,2,3,4],'GDP':[80855,77388,68024,47251]}#字典的key可以是''也可以是""
city=["GD","JS","SD","ZJ"]
df=pd.DataFrame(data,index=city)
print(df)
#输出格式
rank GDP
GD 1 80855
JS 2 77388
SD 3 68024
ZJ 4 47251
print(df.dtypes)#返回数据类型,因为是多个数据,所以要用复数
#输出
rank int64
GDP int64
dtype: object
print(df.values)#返回每一列数据的值
#输出:数据框的值组成的二维数组
[[ 1 80855]
[ 2 77388]
[ 3 68024]
[ 4 47251]]
print(df.index)#返回索引
#输出
Index(['GD', 'JS', 'SD', 'ZJ'], dtype='object')
#用列表生成dataframe
import pandas as pd
data=[['May',689],['Tony',659],['Kevin',635]]
rank=[1,2,3]
result=pd.DataFrame(data,index=rank)
print(result)
#输出,如果是列表没有列名
0 1
1 May 689
2 Tony 659
3 Kevin 635
result=pd.DataFrame(data,index=rank,columns=["name","score"])#设置列名
print(result)
#输出,
name score
1 May 689
2 Tony 659
3 Kevin 635
3.3设置或修改索引
#用字典生成dataframe
import pandas as pd
data={'rank':[1,2,3,4],'GDP':[80855,77388,68024,47251]}#字典的key可以是''也可以是""
city=["GD","JS","SD","ZJ"]
df=pd.DataFrame(data,index=city)
name_new=['广州','JS','山东','ZJ']
df.index=name_new
print(df)
#输出
rank GDP
广州 1 80855
JS 2 77388
山东 3 68024
ZJ 4 47251
3.4选择数据
一般在数据分析时,取列数据最为常用,如:选取四个省份的排名数据
取单独一列 dataframe['列名']
取多列需要先把要取的列名组成列表,再用dataframe[list]取数
list=['列名1','列名2','列名3']
dataframe[list]
#取列数据
df['rank']
#输出
广州 1
JS 2
山东 3
ZJ 4
Name: rank, dtype: int64
#取两列及以上数据,需要先把列名组成列表,再用数据框[列名列表]取数
df[['GDP','rank']]
#输出
GDP rank
广州 80855 1
JS 77388 2
山东 68024 3
ZJ 47251 4
取行数据 dataframe.iloc[第几行]
#取行数据,取第一行
df.iloc[0]
#输出
rank 1
GDP 80855
Name: 广州, dtype: int64
#取第1、2行数据
df.iloc[0:2]
#输出
rank GDP
广州 1 80855
JS 2 77388
取特定索引数据 dataframe.loc['索引名']
#根据索引取广州的数据
df.loc['广州']
#输出
rank 1
GDP 80855
Name: 广州, dtype: int64
#根据索引取广州和山东的数据,需要先把索引组成列表,再用数据框[索引列表]取数
df.loc[['广州','山东']]
#输出
rank GDP
广州 1 80855
山东 3 68024
取行*列索引
print(df)
#输出
rank GDP
广州 1 80855
JS 2 77388
山东 3 68024
ZJ 4 47251
df.iloc[0,1]#输出第1行第二列数据
#输出: 80855
df.iloc[[0,2],[0,1]]#输出第1、3行第1、2列数据
#数据
rank GDP
广州 1 80855
山东 3 68024
布尔索引
注意:这里组合条件不能用and和or,而是& 和 |
print(df)
#输出:
rank GDP
广州 1 80855
JS 2 77388
山东 3 68024
ZJ 4 47251
df[df['rank']<=3]#单一条件
#输出:
rank GDP
广州 1 80855
JS 2 77388
山东 3 68024
df[(df['rank']<=3) & (df['GDP']>=70000)] #组合条件:且&
#输出:
rank GDP
广州 1 80855
JS 2 77388
df[(df['rank']<=2) | (df['GDP']<50000)]#组合条件:或|
rank GDP
广州 1 80855
JS 2 77388
ZJ 4 47251
总结不同取数方式
取列 | dataframe['列名'] |
取多列 | list=['列名1','列名2','列名3'] dataframe[list] 也可以直接写 dataframe[['列名1','列名2','列名3']] |
取行 | dataframe.iloc[第几行] |
取多行 | dataframe.iloc[第几行:第几行] |
取索引 | dataframe.loc['索引名'] |
取多个索引 | list=['索引1','索引2','索引3'] dataframe[list] |
取某个特定单元格的值(行*列) | dataframe.iloc[第几行,第几列] |
取多个特定单元格的值(行*列) | dataframe.iloc[[第几行,第几行],[第几列,第几列]] |
布尔索引,单一条件 | 条件=dataframe['列名']>=3 dataframe[条件] 也可以直接写:dataframe[dataframe['列名']>=3] |
布尔索引,且 | dataframe[(dataframe['列名']>=3) & (dataframe['列名2']=='广东')] |
布尔索引,或 | dataframe[(dataframe['列名']>=3) | (dataframe['列名2']=='广东')] |
*行数和列数都是从0开始算