pandas数据结构之DataFrame(数据帧)

DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

说到表格, 你可以把DataFrame想象成一个excel表格,或者一张sql表, 它是pandas使用频率最高的一种数据结构, 掌握了DataFrame才算是真正的掌握了pandas

1. 创建一个DataFrame

创建一个DataFrame的方式可谓是多种多样,五花八门,下面罗列出常用的创建DataFrame方法

  1. 用字典创建DataFrame
  2. 用列表创建DataFrame
  3. 用value是series的字典创建DataFrame
  4. 用另外一个DataFrame创建

1.1 创建一个空的DataFrame

import pandas as pd
df = pd.DataFrame()
print(df)

程序输出结果

Empty DataFrame
Columns: []
Index: []

1.2 使用字典创建DataFrame

先看例子,再解释具体方法

import pandas as pd

data = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df = pd.DataFrame(data)
print(df)

df的内容为

   语文  数学
0  90  92
1  98  87
2  87  90
3  90  98

前面提到过,你可以把dataframe理解为一张excel表格,如此一来,语文,数学就算是表格的标题, 在DataFrame中,他们是列索引。接下来是4行数据, 0,1,2,3,是行索引。 显然,现在还缺少名字这一列,我们可以把名字单独作为一列,也可以把名字设置为索引, 自需要修改一行代码就可以实现这个目标

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])

df的内容变为

    语文  数学
小明  90  92
小红  98  87
小刚  87  90
小丽  90  98

为什么说pandas是做数据分析的利器呢,因为使用它分析数据是在是太方便了,现在,我就来演示一下使用pandas做数据分析,我设置以下几个数据分析的目标

  1. 语文最高分
  2. 找出总分最高的学生

代码实现如下

import pandas as pd

data = {
    '语文': [90, 98, 87, 90],
    '数学': [92, 87, 90, 98]
}

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
yuwen_series = df['语文']
max_yuwen = yuwen_series.max()  # 语文最高分
print('语文最高分{max_score}'.format(max_score=max_yuwen))

# 创建出总分列, 由每一行的语文和数学分数相加
df['总分'] = df['语文'] + df['数学']
max_sum = df['总分'].max()

stu_name = df['总分'].idxmax()
print('{stu}总分最高, {score}'.format(stu=stu_name, score=max_sum))

输出结果

语文最高分98
小丽总分最高, 188

关于代码,有几处需要做一些解释

  1. df['语文']类型是Series
  2. df['总分']是新创建的一列,可以有已经存在的列直接相加得到
  3. idxmax()方法会返回一个Series中最大值的索引

1.3 使用列表创建DataFrame

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
print(df)

数据和1.2小节中的一样,只是换了一种存储方式,在列表里, 有4个字典,每个字典有两个key-value对,df的输出结果与之前一样

    数学  语文
小明  92  90
小红  87  98
小刚  90  87
小丽  98  90

除了可以指定index以外,还可以指定所需要的列, 比如,你只想创建一个有语文的DataFrame, 那么可以这样写

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'], columns=['语文'])

指定columns参数, 最终df的内容是

    语文
小明  90
小红  98
小刚  87
小丽  90

1.4 用value是series的字典创建DataFrame

import pandas as pd

data = {
    '语文': pd.Series([90, 98, 87], index=['小明', '小红', '小刚']),
    '数学': pd.Series([92, 87, 90, 98], index=['小明', '小红', '小刚', '小丽'])
}

df = pd.DataFrame(data)
print(df)

和1.2小节的方法类似,不过这次字典里的value变成了series类型,数据中缺失了小丽的语文分数,最终df输出结果是

      语文  数学
小丽   NaN  98
小刚  87.0  90
小明  90.0  92
小红  98.0  87

缺失的数值用np.nan填充

1.5 用另外一个DataFrame创建

可以根据一个已经存在的DataFrame创建出一个新的DataFrame

import pandas as pd

data = {
    '语文': pd.Series([90, 98, 87], index=['小明', '小红', '小刚']),
    '数学': pd.Series([92, 87, 90, 98], index=['小明', '小红', '小刚', '小丽'])
}

df = pd.DataFrame(data)

df_2 = pd.DataFrame(df, index=['小明', '小红', '小刚'])
print(df_2)

创建df_2时,我指定了3个索引, 这样,就去掉了小丽的数据, 最终的结果是

      语文  数学
小明  90.0  92
小红  98.0  87
小刚  87.0  90

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案