Python酷库之旅-第三方库Pandas(017)

CSDN 2024-08-01 16:05:02 阅读 53

目录

一、用法精讲

41、pandas.melt函数

41-1、语法

41-2、参数

41-3、功能

41-4、返回值

41-5、说明

41-5-1、宽格式数据(Wide Format)

41-5-2、长格式数据(Long Format)

41-6、用法

41-6-1、数据准备

41-6-2、代码示例

41-6-3、结果输出

42、pandas.pivot函数

42-1、语法

42-2、参数

42-3、功能

42-4、返回值

42-5、说明

42-6、用法

42-6-1、数据准备

42-6-2、代码示例

42-6-3、结果输出 

43、pandas.pivot_table函数

43-1、语法

43-2、参数

43-3、功能

43-4、返回值

43-5、说明

43-6、用法

43-6-1、数据准备

43-6-2、代码示例

43-6-3、结果输出

二、推荐阅读

1、Python筑基之旅

2、Python函数之旅

3、Python算法之旅

4、Python魔法之旅

5、博客个人主页

一、用法精讲

41、pandas.melt函数
41-1、语法

<code># 41、pandas.melt函数

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)code>

Unpivot a DataFrame from wide to long format, optionally leaving identifiers set.

This function is useful to massage a DataFrame into a format where one or more columns are identifier variables (id_vars), while all other columns, considered measured variables (value_vars), are “unpivoted” to the row axis, leaving just two non-identifier columns, ‘variable’ and ‘value’.

Parameters:

id_vars

scalar, tuple, list, or ndarray, optional

Column(s) to use as identifier variables.

value_vars

scalar, tuple, list, or ndarray, optional

Column(s) to unpivot. If not specified, uses all columns that are not set as id_vars.

var_name

scalar, default None

Name to use for the ‘variable’ column. If None it uses frame.columns.name or ‘variable’.

value_name

scalar, default ‘value’

Name to use for the ‘value’ column, can’t be an existing column label.

col_level

scalar, optional

If columns are a MultiIndex then use this level to melt.

ignore_index

bool, default True

If True, original index is ignored. If False, the original index is retained. Index labels will be repeated as necessary.

Returns:

DataFrame

Unpivoted DataFrame.

41-2、参数

41-2-1、frame(必须)要转换的DataFrame。

41-2-2、id_vars(可选,默认值为None)在熔化过程中用作标识符变量的列名列表,这些列将保持在结果DataFrame中,不会“熔化”成行,如果不提供,则假定没有标识符变量,所有列都将被熔化。

41-2-3、value_vars(可选,默认值为None)要熔化成行变量的列名列表,如果未指定,则除了id_vars之外的所有列都将被熔化。

41-2-4、var_name(可选,默认值为None)在熔化后的DataFrame中,用于存储原列名(即value_vars中的列名)的列名,如果未指定,则默认为'variable'。

41-2-5、value_name(可选,默认值为'value')在熔化后的DataFrame中,用于存储原列值的列名。

41-2-6、col_level(可选,默认值为None)如果列是多级索引(MultiIndex),则此参数用于选择将被熔化的级别,可以是级别编号、级别名称或级别名称的元组/列表。

41-2-7、ignore_index(可选,默认值为True)是否在熔化后重置索引,如果为True,则忽略原始索引,并在熔化后创建一个新的整数索引。

41-3、功能

        用于将DataFrame中的宽格式数据(即具有多个变量列的数据)转换为长格式(或称为“熔化”格式),这在进行数据可视化准备数据以进行某些类型的分析时非常有用。

41-4、返回值

        返回一个新的DataFrame,该DataFrame包含了熔化后的数据。

41-5、说明

        宽格式数据和长格式数据是数据处理中常见的两种数据格式,它们在数据结构和呈现方式上有所不同,适用于不同的分析需求。

41-5-1、宽格式数据(Wide Format)

41-5-1-1、定义

        宽格式数据是指数据集对所有的变量进行了明确的细分,每个变量都占有一列,每个观察值占有一行,这种格式下,数据总体的表现为变量多而观察值少,每一行数据为一条完整的记录,记录着某个实体(如个体、时间点等)的各种属性或变量。

41-5-1-2、特点

41-5-1-2-1、变量多而观察值少:每个变量都作为一列存在,每行数据包含该实体所有变量的值。

41-5-1-2-2、易于理解:对于人类阅读者来说,宽格式数据通常更直观易懂,因为每行都是一个实体的完整信息。

41-5-1-2-3、适用于某些分析:在需要同时查看多个变量值的情况下,宽格式数据更为方便。

41-5-1-3、示例        

        假设有一份学生信息表,包括学生的姓名、年龄、性别、成绩等字段,每行代表一个学生的信息,那么这份数据就是宽格式数据。

41-5-2、长格式数据(Long Format)

41-5-2-1、定义

        长格式数据一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即变量少而观察值多,在这种格式下,每一行数据记录的是某个实体(如个体、时间点等)的一个属性或变量的值,形式通常为“key:value”对。

41-5-2-2、特点

41-5-2-2-1、变量少而观察值多:数据通过更多的行来表示,每行只包含一个变量(或属性)的值,以及一个或多个用于标识实体的标识符(如ID)。

41-5-2-2-2、便于数据分析:在需要进行统计分析、数据可视化或建模时,长格式数据通常更为灵活和方便。

41-5-2-2-3、需要转换:在某些情况下,为了进行特定的分析或可视化,可能需要将宽格式数据转换为长格式数据。

41-5-2-3、示例

        如果上述学生信息表被转换为长格式,那么可能会有多行数据来分别表示每个学生的姓名、年龄、性别和成绩等信息,每行都会包含一个标识符(如学生ID)来区分不同的学生。

        总之,宽格式数据和长格式数据各有优缺点,适用于不同的场景和需求。在处理数据时,应根据具体的分析目标和工具选择合适的数据格式;同时,了解如何在不同格式之间进行转换也是数据处理和分析的重要技能之一。

41-6、用法
41-6-1、数据准备

41-6-2、代码示例

# 41、pandas.melt函数

import pandas as pd

df = pd.DataFrame({

'A': ['foo', 'bar', 'baz'],

'B': [1, 2, 3],

'C': [4, 5, 6]

})

print(df, end='\n\n')code>

melted_df = pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])

print(melted_df)

41-6-3、结果输出

# 41、pandas.melt函数

# A B C

# 0 foo 1 4

# 1 bar 2 5

# 2 baz 3 6

#

# A variable value

# 0 foo B 1

# 1 bar B 2

# 2 baz B 3

# 3 foo C 4

# 4 bar C 5

# 5 baz C 6

42、pandas.pivot函数
42-1、语法

# 42、pandas.pivot函数

pandas.pivot(data, *, columns, index=_NoDefault.no_default, values=_NoDefault.no_default)

Return reshaped DataFrame organized by given index / column values.

Reshape data (produce a “pivot” table) based on column values. Uses unique values from specified index / columns to form axes of the resulting DataFrame. This function does not support data aggregation, multiple values will result in a MultiIndex in the columns. See the User Guide for more on reshaping.

Parameters:

data

DataFrame

columns

str or object or a list of str

Column to use to make new frame’s columns.

index

str or object or a list of str, optional

Column to use to make new frame’s index. If not given, uses existing index.

values

str, object or a list of the previous, optional

Column(s) to use for populating new frame’s values. If not specified, all remaining columns will be used and the result will have hierarchically indexed columns.

Returns:

DataFrame

Returns reshaped DataFrame.

Raises:

ValueError:

When there are any index, columns combinations with multiple values. DataFrame.pivot_table when you need to aggregate.

42-2、参数

42-2-1、data(必须)DataFrame或Series对象,这是你想要重塑的原始数据

42-2-2、columns(必须)用于新DataFrame的列索引的列名或列名列表,这个参数指定了原始DataFrame中哪些列的值将被用作新DataFrame的列标题。

42-2-3、index(必须)用于新DataFrame的行索引的列名或列名列表,如果未指定,则使用原始 DataFrame 的索引,这个参数是必需的(虽然在函数签名中标记为可选,但实际上不指定会导致错误),但函数签名中的_NoDefault.no_default是一种内部机制,用于在函数定义时表明这个参数不应该有默认值,必须显式提供。

42-2-4、values(可选)指定哪些列的值应该被填充到新DataFrame的单元格中,如果未指定,则所有剩余列的值都会被填充进去,但这样可能会导致结果DataFrame的列具有多层索引(MultiIndex),因为每个剩余列都会成为一层。

42-3、功能

        似于Excel中的数据透视表功能,它允许用户根据指定的行索引(index)和列索引(columns)来重塑DataFrame,并将选定的值(values)填充到新的DataFrame中。

42-4、返回值

        返回一个新的DataFrame对象,该对象根据指定的行索引、列索引和值进行了重塑。返回的DataFrame的行由index参数指定的列的值确定,列由columns参数指定的列的值确定,而单元格的值则由values参数指定的列的值填充。

42-5、说明

42-5-1、如果在指定的index和columns下存在重复的values,pivot函数将抛出错误,因为它无法确定如何将这些重复的值分配到新的DataFrame中。

42-5-2、pivot函数不支持直接的数据聚合运算,但它可以通过重新排列数据来为后续的聚合运算(如使用groupby和agg函数)提供便利。

42-5-3、在使用pivot函数时,必须确保index和columns参数指定的列中的值能够唯一地确定每个单元格的位置,否则将无法生成有效的DataFrame。

42-6、用法
42-6-1、数据准备

42-6-2、代码示例

# 42、pandas.pivot函数

import pandas as pd

# 创建一个包含销售数据的字典

data = {

'year': [2023, 2023, 2024, 2024],

'product': ['A', 'B', 'A', 'B'],

'sales': [100, 200, 150, 250]

}

# 将字典转换为DataFrame

df = pd.DataFrame(data)

print(df, end='\n\n')code>

# 使用pivot重塑DataFrame

# 指定'year'为行索引,'product'为列索引,'sales'为要填充的值

pivoted = pd.pivot(df, index='year', columns='product', values='sales')code>

# 打印重塑后的DataFrame

print(pivoted)

42-6-3、结果输出 

# 42、pandas.pivot函数

# year product sales

# 0 2023 A 100

# 1 2023 B 200

# 2 2024 A 150

# 3 2024 B 250

# product A B

# year

# 2023 100 200

# 2024 150 250

43、pandas.pivot_table函数
43-1、语法

# 43、pandas.pivot_table函数

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=_NoDefault.no_default, sort=True)code>

Create a spreadsheet-style pivot table as a DataFrame.

The levels in the pivot table will be stored in MultiIndex objects (hierarchical indexes) on the index and columns of the result DataFrame.

Parameters:

dataDataFrame

valueslist-like or scalar, optional

Column or columns to aggregate.

indexcolumn, Grouper, array, or list of the previous

Keys to group by on the pivot table index. If a list is passed, it can contain any of the other types (except list). If an array is passed, it must be the same length as the data and will be used in the same manner as column values.

columnscolumn, Grouper, array, or list of the previous

Keys to group by on the pivot table column. If a list is passed, it can contain any of the other types (except list). If an array is passed, it must be the same length as the data and will be used in the same manner as column values.

aggfuncfunction, list of functions, dict, default “mean”

If a list of functions is passed, the resulting pivot table will have hierarchical columns whose top level are the function names (inferred from the function objects themselves). If a dict is passed, the key is column to aggregate and the value is function or list of functions. If margin=True, aggfunc will be used to calculate the partial aggregates.

fill_valuescalar, default None

Value to replace missing values with (in the resulting pivot table, after aggregation).

marginsbool, default False

If margins=True, special All columns and rows will be added with partial group aggregates across the categories on the rows and columns.

dropnabool, default True

Do not include columns whose entries are all NaN. If True, rows with a NaN value in any column will be omitted before computing margins.

margins_namestr, default ‘All’

Name of the row / column that will contain the totals when margins is True.

observedbool, default False

This only applies if any of the groupers are Categoricals. If True: only show observed values for categorical groupers. If False: show all values for categorical groupers.

Deprecated since version 2.2.0: The default value of False is deprecated and will change to True in a future version of pandas.

sortbool, default True

Specifies if the result should be sorted.

New in version 1.3.0.

Returns:

DataFrame

An Excel style pivot table.

43-2、参数

43-2-1、data(必须)必须是DataFrame类型,表示你要从中创建透视表的数据

43-2-2、values(可选,默认值为None)指定需要聚合的列,默认情况下,所有数值列都将被聚合,如果你只关心某个或某些列,可以在这里指定它们。

43-2-3、index(可选,默认值为None)用于分组的列名列表或列名,结果DataFrame将使用这些列的值作为行索引。

43-2-4、columns(可选,默认值为None)用于分组的另一个列名列表或列名,如果指定了此参数,则这些列的值将用作结果DataFrame的列标题。

43-2-5、aggfunc(可选,默认值为'mean')一个函数或函数列表,用于聚合数据,默认是'mean',即计算平均值。你可以使用如sum、max、min、std(标准差)、first、last等内置函数,或者自定义函数。

43-2-6、fill_value(可选,默认值为None)用于替换结果DataFrame中缺失值的值,默认为None,即不填充缺失值。

43-2-7、margins(可选,默认值为False)布尔值,默认为False,如果为True,则会在结果DataFrame的末尾添加一个全行/全列,包含所有值的聚合(基于aggfunc)。

43-2-8、dropna(可选,默认值为True)布尔值,如果为False,则不会从结果中删除包含缺失值的行。注意,如果index或columns中包含缺失值,并且dropna=True,则这些缺失值会被忽略(即不会出现在结果DataFrame的索引或列标题中)。

43-2-9、margins_name(可选,默认值为'All')字符串,当margins=True时,用于命名全行/全列的标签。

43-2-10、observed(可选)pandas 1.1.0版本中引入的参数,用于控制如何处理未在数据中观察到的组合。如果为True(默认值在1.1.0之前的版本中是None,但在1.1.0及更高版本中变为True),则只包括在数据集中实际观察到的组合;如果为False,则会包括所有可能的组合,即使某些组合在数据中没有出现。

43-2-11、sort(可选,默认值为True)布尔值,如果为True,则结果DataFrame的行和列(如果指定了多个列作为索引/列)将按字典顺序排序;如果为False,则不进行排序。

43-3、功能

       根据一个或多个键(通常是DataFrame中的列)对数据进行分组,并对每个分组应用聚合函数,以创建一个新的DataFrame,这个新的DataFrame以不同的方式组织和汇总了原始数据,便于进行更深入的数据分析和可视化。

43-4、返回值

        返回值是一个新的DataFrame,它根据提供的参数对原始数据进行了重塑和汇总。这个新的DataFrame的行索引由index参数决定,列标题(如果指定了columns参数)也由该参数决定,而单元格中的值则是根据aggfunc参数指定的聚合函数计算得到的。

43-5、说明

        如果margins设置为True,则返回的DataFrame还会包含一个额外的全行或全列(取决于margins_name参数的值,默认为'All'),该行/列包含了所有行的聚合统计量。

43-6、用法
43-6-1、数据准备

43-6-2、代码示例

# 43、pandas.pivot_table函数

import pandas as pd

import numpy as np

# 创建一个示例数据集

data = {

'Date': pd.date_range('2023-01-01', periods=6, freq='D'),code>

'City': ['New York', 'Los Angeles', 'New York', 'Los Angeles', 'New York', 'Los Angeles'],

'Category': ['A', 'A', 'B', 'B', 'A', 'B'],

'Values': [100, 200, 150, 250, np.nan, 300]

}

df = pd.DataFrame(data)

print("原始数据集:")

print(df)

# 使用pivot_table重塑DataFrame

pivot_table = pd.pivot_table(

data=df,

values='Values',code>

index=['Date', 'City'],

columns='Category',code>

aggfunc='mean',code>

fill_value=0,

margins=True,

margins_name='All',code>

dropna=True,

sort=True

)

print("\npivot_table结果:")

print(pivot_table)

43-6-3、结果输出

# 43、pandas.pivot_table函数

# 原始数据集:

# Date City Category Values

# 0 2023-01-01 New York A 100.0

# 1 2023-01-02 Los Angeles A 200.0

# 2 2023-01-03 New York B 150.0

# 3 2023-01-04 Los Angeles B 250.0

# 4 2023-01-05 New York A NaN

# 5 2023-01-06 Los Angeles B 300.0

# pivot_table结果:

# Category A B All

# Date City

# 2023-01-01 00:00:00 New York 100.0 0.000000 100.0

# 2023-01-02 00:00:00 Los Angeles 200.0 0.000000 200.0

# 2023-01-03 00:00:00 New York 0.0 150.000000 150.0

# 2023-01-04 00:00:00 Los Angeles 0.0 250.000000 250.0

# 2023-01-06 00:00:00 Los Angeles 0.0 300.000000 300.0

# All 150.0 233.333333 200.0

二、推荐阅读

1、Python筑基之旅
2、Python函数之旅
3、Python算法之旅
4、Python魔法之旅
5、博客个人主页


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。