pandas - 数据结构与常用函数

时间:2020-08-09 21:28:45   收藏:0   阅读:123

1. Pandas数据结构

homepage

1.1. Series

1.1.1. 创建

注意,创建时需要数据值(value)及其索引 index(类似key)。

pd.Series([1, "a", 5.2, 7], index=["a", "b", "c", "d"])

## 2. 直接使用dict创建
pd.Series({"a": 1, "b": 2})

2. 访问数据

series["a"] = "new"
series[["a", "b"]]  ## 查询多个值

2. 属性

2.1. DataFrame

Dataframe是一个表格型的数据结构

创建 Datarame 最常用的方法,包括读取纯文本文件、excel、mysql数据库等。

基本使用:

  1. 使用多个字典序列创建DataFrame

    data = {
        "state": ["a", "b", "c", "d"],
        "year": [2001, 2002, 2003, 2004],
        "pop": [1.6, 3.2, 7.9, 2.1]
    }
    df = pd.DataFrame(data)
    
  2. 查询数据类型

    df.dtypes
    
  3. 查询列索引、行索引

    df.columns
    df.index
    

2.1.1. 从DataFame中查询Series

查询列

df["a"]
df[["a", "b"]]

查询行

df.loc[1]
df.loc[1:3]  ## 通过切片的方式获取多行。注意:不同于list切片,loc[1:3]包含末尾元素`3`

2.2. 获取Pandas元素

homepage

需要认识到,pandas的索引方式,是有限索引行,然后再列。你无法做到loc某一列。如果非要,可以考虑直接提取Series,然后进行操作。

>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
...      index=[‘cobra‘, ‘viper‘, ‘sidewinder‘],
...      columns=[‘max_speed‘, ‘shield‘])
>>> df
            max_speed  shield
cobra               1       2
viper               4       5
sidewinder          7       8

## 3. 选取元素
>>> df.loc[‘cobra‘, ‘shield‘]
2

## 4. 选取行返回一个series
>>> df.loc[‘viper‘]
max_speed    4
shield       5
Name: viper, dtype: int64

## 5. 选取行列返回DataFrame
>>> df.loc[[‘viper‘, ‘sidewinder‘]]
            max_speed  shield
viper               4       5
sidewinder          7       8

With a callable, useful in method chains. The x passed to the lambda is the DataFrame being sliced. This selects the rows whose index label even.

>>> df.iloc[lambda x: x.index % 2 == 0]
      a     b     c     d
0     1     2     3     4
2  1000  2000  3000  4000

With a boolean array whose length matches the columns.

>>> df.iloc[:, [True, False, True, False]]
      a     c
0     1     3
1   100   300
2  1000  3000

5.1. 新增数据列

new_df = pd.concat([df, pd.DataFrame(columns=["h_low", "h_high", "s_low", "s_high", "v_low", "v_high"])])
new_df.h_low[idx] = 123  ## 数据赋值

5.2. 删除行或列

DataFrame.drop(labels=None,axis=0,index=None,columns=None, inplace=False)

参数说明:

因此,删除行列有两种方式:

## 6. df=pd.read_excel(‘data_1.xlsx‘)
df=df.drop([‘学号‘,‘语文‘], axis=1)
df=df.drop([1,2], axis=0)

6.1. 保存当前的数据(序列化)

df2.to_csv("triage_new.csv")

7. 数据变换与预处理

常用函数如下

用于演示的数据如下:

In [15]: data
Out[15]:
  company  salary  age
0     NaN      43   21
1       A       8   41
2       A      28   26
3       C      42   28
4       A      33   26
5       C      20   18
6       A      48   43
7       B      25   23
8       B      39   18

8. 数据统计函数

Github: (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

本文就将针对pandas中的map()、apply()、applymap()、groupby()、agg()等方法展开详细介绍,并结合实际例子帮助大家更好地理解它们的使用技巧。

8.1. 数据载入

首先读入数据,这里使用到的全美婴儿姓名数据,包含了1880-2018年全美每年对应每个姓名的新生儿数据,在jupyterlab中读入数据并打印数据集的一些基本信息以了解我们的数据集:

import pandas as pd

## 9. 读入数据
data = pd.read_csv(‘data.csv‘)
data.head()

技术分享图片

查看各列数据类型、数据框行列数

print(data.dtypes)
print()
print(data.shape)

9.1. 非聚合类方法(无需分组)

这里的非聚合指的是数据处理前后没有进行分组操作,数据列的长度没有发生改变,因此本章节中不涉及groupby()。

9.2. 聚合类方法

有些时候我们需要像SQL里的聚合操作那样将原始数据按照某个或某些离散型的列进行分组再求和、平均数等聚合之后的值,在pandas中分组运算是一件非常优雅的事。

9.2.1. 利用groupby()进行分组

要进行分组运算第一步当然就是分组,在pandas中对数据框进行分组使用到groupby()方法。

其主要使用到的参数为by,这个参数用于传入分组依据的变量名称,当变量为1个时传入名称字符串即可。

当为多个时传入这些变量名称列表,DataFrame对象通过groupby()之后返回一个生成器,需要将其列表化才能得到需要的分组后的子集,如下面的示例:

## 10. 按照年份和性别对婴儿姓名数据进行分组
groups = data.groupby(by=[‘year‘,‘gender‘])
## 11. 查看groups类型
type(groups)

可以看到它此时是生成器,下面我们用列表解析的方式提取出所有分组后的结果:

## 12. 利用列表解析提取分组结果
groups = [group for group in groups]

查看其中的一个元素,可以看到每一个结果都是一个二元组,元组的第一个元素是对应这个分组结果的分组组合方式,第二个元素是分组出的子集数据框,而对于DataFrame.groupby()得到的结果。

技术分享图片

直接调用聚合函数

譬如这里我们提取count列后直接调用max()方法:

## 13. 求每个分组中最高频次
data.groupby(by=[‘year‘,‘gender‘])[‘count‘].max()

注意这里的year、gender列是以索引的形式存在的,想要把它们还原回数据框,使用reset_index(drop=False)即可:

data.groupby(by=[‘year‘,‘gender‘])[‘count‘].max().reset_index(drop=False)
结合apply()

分组后的结果也可以直接调用apply(),这样可以编写更加自由的函数来完成需求,譬如下面我们通过自编函数来求得每年每种性别出现频次最高的名字及对应频次。

要注意的是,这里的apply传入的对象是每个分组之后的子数据框,所以下面的自编函数中直接接收的df参数即为每个分组的子数据框:

import numpy as np

def find_most_name(df):
    return str(np.max(df[‘count‘]))+‘-‘+df[‘name‘][np.argmax(df[‘count‘])]

data.groupby([‘year‘,‘gender‘]).apply(find_most_name).reset_index(drop=False)

13. 利用agg()进行更灵活的聚合

agg即aggregate,聚合,在pandas中可以利用agg()对Series、DataFrame以及groupby()后的结果进行聚合。

其传入的参数为字典,键为变量名,值为对应的聚合函数字符串,譬如 {‘v1‘:[‘sum‘,‘mean‘], ‘v2‘:[‘median‘,‘max‘,‘min]} 就代表对数据框中的v1列进行求和、均值操作,对v2列进行中位数、最大值、最小值操作。

下面用几个简单的例子演示其具体使用方式:

聚合Series

在对Series进行聚合时,因为只有1列,所以可以不使用字典的形式传递参数,直接传入函数名列表即可:

## 14. 求count列的最小值、最大值以及中位数
data[‘count‘].agg([‘min‘,‘max‘,‘median‘])

技术分享图片

聚合数据框

对数据框进行聚合时因为有多列,所以要使用字典的方式传入聚合方案:

 data.agg({‘year‘: [‘max‘,‘min‘], ‘count‘: [‘mean‘,‘std‘]})

技术分享图片

值得注意的是,因为上例中对于不同变量的聚合方案不统一,所以会出现NaN的情况。

聚合groupby()结果

data.groupby([‘year‘,‘gender‘]).agg({‘count‘:[‘min‘,‘max‘,‘median‘]}).reset_index(drop=False)

技术分享图片

可以注意到虽然我们使用reset_index()将索引列还原回变量,但聚合结果的列名变成红色框中奇怪的样子,而在pandas 0.25.0以及之后的版本中,可以使用pd.NamedAgg()来为聚合后的每一列赋予新的名字:

data.groupby([‘year‘,‘gender‘]).agg(
    min_count=pd.NamedAgg(column=‘count‘, aggfunc=‘min‘),
    max_count=pd.NamedAgg(column=‘count‘, aggfunc=‘max‘),
    median=pd.NamedAgg(column=‘count‘, aggfunc=‘median‘)).reset_index(drop=False)

技术分享图片

14.1. groupby 详解

df.groupby("A").sum()
df.groupby(["A", "B"]).mean()
df.groupby(["A", "B"], as_index=False).mean()
df.groupby("A").agg([np.sum, np.mean, np.std])
df.groupby("A")["C"].agg([np.sum, np.mean, np.std])
df.groupby("A").agg([np.sum, np.mean, np.std])["C"]  ## 同上
df.groupby("A").agg({"C": np.sum, "D": np.maen})

14.1.1. GroupBy遵从split、apply、combine模式

技术分享图片

14.1.2. 归一化:电影评分

def normalize(df):
    min_value = df["Rating"].min()
    max_value = df["Rating"].max()
    df["Rating_norm"] = df["Roting"].apply(
        lambda x: (x-min_value)/(max_value-min_value))
    return df
def top_2(df, n=2):
    return df.sort_values(by="Rating")[[]]

df.groupby("manth").apply(get_)

原文:https://www.cnblogs.com/brt2/p/13466166.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!