用pandas探索你的数据(一)开始了解你的数据

用pandas探索你的数据(一):开始了解你的数据

探索Chipotle快餐数据

image description
image description

步骤1 导入必要的库

# 运行以下代码
import pandas as pd

步骤2 从如下地址导入数据集

# 运行以下代码
path1 = "exercise_data/chipotle.tsv"    # chipotle.tsv

步骤3 将数据集存入一个名为chipo的数据框内

pandas 中的 read_csv 函数用于从 CSV(逗号分隔值)文件中读取数据并将其转换为 DataFrame(数据表格)。下面是有关 read_csv 函数的详细解释:

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, dtype=None, parse_dates=False, na_values=None, thousands=None, decimal='.', keep_default_na=True, skipinitialspace=False, skiprows=None, skipfooter=0, encoding=None, engine='c', comment=None, quoting=None, doublequote=True, quotechar='"', escapechar=None, nrows=None, dayfirst=False, date_parser=None, memory_map=False, float_precision=None, storage_options=None)

常用参数的解释:

  1. filepath_or_buffer:必选参数,指定要读取的 CSV 文件的路径或 URL,也可以是一个类文件对象(如 StringIO 或 BytesIO)。

  2. sep:可选参数,默认为逗号(','),用于指定字段之间的分隔符,例如 '\t' 表示制表符分隔。

  3. delimiter:可选参数,与 sep 具有相同的作用,用于指定分隔符。

  4. header:可选参数,默认为 'infer',用于指定哪一行作为列名,如果设置为 None,则不使用列名。

  5. names:可选参数,用于手动指定列名,可以传入一个列表,与 CSV 文件的列数对应。

  6. index_col:可选参数,用于指定哪一列作为索引列,可以是列名或列的索引(0 表示第一列,1 表示第二列,以此类推)。

  7. usecols:可选参数,用于指定要读取的列,可以是列名或列的索引,传入一个列表。

  8. dtype:可选参数,用于指定每列的数据类型,可以传入一个字典,将列名映射到数据类型。

  9. parse_dates:可选参数,用于指定是否尝试解析日期列,可以传入列名或列的索引,或一个包含列名/索引的列表。

  10. na_values:可选参数,用于指定将被解释为缺失值的值,例如 'NA'、'NaN' 等。

  11. thousands:可选参数,用于指定千位分隔符,例如 ','。

  12. decimal:可选参数,用于指定小数点符号。

  13. skiprows:可选参数,用于指定要跳过的行数,可以传入一个整数或包含要跳过的行索引的列表。

  14. encoding:可选参数,用于指定文件的编码格式,例如 'utf-8'、'latin1' 等。

  15. engine:可选参数,用于指定解析引擎,通常不需要手动指定,'c' 通常是最快的。

  16. comment:可选参数,用于指定注释符号,解析时会忽略注释符号后面的内容。

  17. quoting:可选参数,用于指定引用字段的引号规则,例如 'minimal'、'all' 等。

  18. nrows:可选参数,用于指定要读取的行数,从文件的开头开始读取。

  19. date_parser:可选参数,用于指定一个自定义日期解析函数。

  20. float_precision:可选参数,用于指定浮点数的精度。

  21. storage_options:可选参数,用于传递给底层存储库的选项,如 Amazon S3。

# 运行以下代码
chipo = pd.read_csv(path1, sep = '\t')

步骤4 查看前10行内容

pandas 中的 headtail 函数用于查看 DataFrame 的前几行和后几行数据,以便快速浏览数据的开头和结尾。下面是关于这两个函数的详细解释:

  1. head 函数:
DataFrame.head(n=5)

head 函数默认返回 DataFrame 的前5行数据,但您可以通过传递 n 参数来指定要返回的行数。例如,DataFrame.head(10) 将返回前10行数据。

  1. tail 函数:
DataFrame.tail(n=5)

tail 函数默认返回 DataFrame 的最后5行数据,但您也可以通过传递 n 参数来指定要返回的行数。例如,DataFrame.tail(8) 将返回最后8行数据。

这两个函数的主要用途是在处理大型数据集时,快速查看数据的一部分,以了解数据的结构和内容,以及检查数据是否被正确加载。它们不会修改原始数据,而只是返回一个新的 DataFrame,包含所请求的行数。

示例用法:

import pandas as pd

# 创建一个示例 DataFrame
data = {'Name': ['Alice''Bob''Charlie''David''Eve'],
        'Age': [2530354045]}
df = pd.DataFrame(data)

# 使用 head 查看前两行数据
print(df.head(2))

# 使用 tail 查看最后三行数据
print(df.tail(3))

这将输出:

      Name  Age
0    Alice   25
1      Bob   30

      Name  Age
2  Charlie   35
3    David   40
4      Eve   45
# 运行以下代码
chipo.head(10)
order_idquantityitem_namechoice_descriptionitem_price
011Chips and Fresh Tomato SalsaNaN$2.39
111Izze[Clementine]$3.39
211Nantucket Nectar[Apple]$3.39
311Chips and Tomatillo-Green Chili SalsaNaN$2.39
422Chicken Bowl[Tomatillo-Red Chili Salsa (Hot), [Black Beans...$16.98
531Chicken Bowl[Fresh Tomato Salsa (Mild), [Rice, Cheese, Sou...$10.98
631Side of ChipsNaN$1.69
741Steak Burrito[Tomatillo Red Chili Salsa, [Fajita Vegetables...$11.75
841Steak Soft Tacos[Tomatillo Green Chili Salsa, [Pinto Beans, Ch...$9.25
951Steak Burrito[Fresh Tomato Salsa, [Rice, Black Beans, Pinto...$9.25

步骤6 数据集中有多少个列(columns)

pandas 中的 shape 属性是 DataFrame 和 Series 对象的一个属性,它用于获取数据结构的维度信息。具体来说,shape 返回一个元组,表示 DataFrame 或 Series 的维度,其中第一个元素是行数,第二个元素是列数。

对于 DataFrame,shape 属性返回一个表示行数和列数的元组 (行数, 列数)。对于 Series,shape 属性返回一个包含单一元素的元组,即 (元素数量,),因为 Series 只有一列。

# 运行以下代码
chipo.shape[1]
5
# 查看有多少行
chipo.shape[0]
4622

步骤7 打印出全部的列名称

# 运行以下代码
chipo.columns
Index(['order_id', 'quantity', 'item_name', 'choice_description',
       'item_price'],
      dtype='object')

步骤8 数据集的索引是怎样的

# 运行以下代码
chipo.index
RangeIndex(start=0, stop=4622, step=1)

步骤9 被下单数最多商品(item)是什么?

  1. grouby函数

pandas 中的 groupby 函数用于将数据按照某一列或多列的值进行分组,然后可以对这些分组进行聚合操作,如求和、计数、平均值等。这是进行数据分析和数据透视的重要操作之一。以下是 groupby 函数的详细解释和用法:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

主要参数:

  • by:分组依据,可以是列名、列名的列表、字典、函数或多个列名。这是 groupby 最重要的参数,用于指定如何分组数据。

  • axis:默认为0,指定按行(0)或按列(1)进行分组。

  • level:如果 DataFrame 包含多级索引,可以指定要按哪一级进行分组。

  • as_index:默认为 True,如果设置为 True,分组的键将成为结果 DataFrame 的索引,否则会作为列添加到结果 DataFrame。

  • sort:默认为 True,如果设置为 False,可以提高性能,但结果可能不会按照分组键排序。

  • group_keys:默认为 True,如果设置为 False,则不在结果 DataFrame 中包含分组键。

  • squeeze:默认为 False,如果为 True 并且只有一组数据,则返回一个 Series。

  • observed:默认为 False,如果设置为 True,则在多级索引情况下,只使用观察到的值进行分组。

  1. agg函数

agg 函数(短 for "aggregate")是 pandas 中用于对 DataFrame 或 Series 执行多个聚合操作的灵活工具。agg 函数允许您一次性传递多个聚合函数,并在每个聚合函数上对数据进行操作。以下是 agg 函数的详细解释和用法:

DataFrame.agg(func, axis=0, *args, **kwargs)

主要参数:

  • func:一个函数、函数列表、函数字典或函数字符串,用于指定要应用于数据的聚合操作。这可以是单个聚合函数或多个聚合函数的组合。

  • axis:默认为0,指定应用聚合操作的轴,0 表示按列应用,1 表示按行应用。

  • *args**kwargs:可选参数,用于传递给聚合函数的额外参数。

# 运行以下代码,做了修正
c = chipo[['item_name','quantity']].groupby(['item_name'],as_index=False).agg({'quantity':sum})
c.sort_values(['quantity'],ascending=False,inplace=True)
c.head()
item_namequantity
17Chicken Bowl761
18Chicken Burrito591
25Chips and Guacamole506
39Steak Burrito386
10Canned Soft Drink351
(chipo[['item_name''quantity']].groupby(['item_name'], as_index=False).agg({'quantity':'sum'})
.sort_values(['quantity'], ascending=False, inplace=False)
.head(10))
item_namequantity
17Chicken Bowl761
18Chicken Burrito591
25Chips and Guacamole506
39Steak Burrito386
10Canned Soft Drink351
23Chips230
38Steak Bowl221
6Bottled Water211
24Chips and Fresh Tomato Salsa130
9Canned Soda126

步骤10 在item_name这一列中,一共有多少种商品被下单?

nunique 函数是 pandas 中用于计算 DataFrame 或 Series 中唯一值的数量的函数。nunique 是 "number of unique" 的缩写,它返回一个标量值,表示唯一值的数量。以下是 nunique 函数的详细解释和用法:

DataFrame/Series.nunique(axis=0, dropna=True)

主要参数:

  • axis:默认为 0,用于指定计算唯一值数量的轴,0 表示按列计算,1 表示按行计算。

  • dropna:默认为 True,如果设置为 True,将忽略缺失值(NaN),只计算非缺失值的唯一值数量。

以下是一些示例用法:

  1. 对 Series 使用 nunique
import pandas as pd

data = pd.Series([122344455None])

# 计算 Series 中的唯一值数量
unique_count = data.nunique()
print(unique_count)

输出:

5

在这个示例中,nunique 函数计算了 Series 中的唯一值数量,忽略了缺失值(None),因此返回了5。

  1. 对 DataFrame 使用 nunique
data = {'A': [122344],
        'B': [4556None6]}

df = pd.DataFrame(data)

# 计算 DataFrame 中每列的唯一值数量
unique_counts = df.nunique()
print(unique_counts)

输出:

A    4
B    4
dtype: int64

在这个示例中,nunique 函数对 DataFrame 中的每列计算了唯一值的数量,分别是列 'A' 中的4个唯一值和列 'B' 中的4个唯一值。

nunique 函数在数据清理、探索性数据分析以及数据统计中经常被用到,它可以帮助您了解数据中不同值的多样性程度。通过设置 axis 参数,您可以在不同的维度上计算唯一值的数量,从而更好地理解数据的特点。

# 运行以下代码
chipo['item_name'].nunique()
50

步骤11 在choice_description中,下单次数最多的商品是什么?

chipo['choice_description'].value_counts().head()
choice_description
[Diet Coke]                                                                          134
[Coke]                                                                               123
[Sprite]                                                                              77
[Fresh Tomato Salsa, [Rice, Black Beans, Cheese, Sour Cream, Lettuce]]                42
[Fresh Tomato Salsa, [Rice, Black Beans, Cheese, Sour Cream, Guacamole, Lettuce]]     40
Name: count, dtype: int64

value_counts 函数是 pandas 中用于计算 Series 或 DataFrame 中唯一值的频次(出现次数)的函数。value_counts 返回一个包含唯一值及其对应频次的 Series,唯一值作为索引,频次作为值。以下是 value_counts 函数的详细解释和用法:

Series.value_counts(normalize=False, sort=True, ascending=False, dropna=True)

主要参数:

  • normalize:默认为 False,如果设置为 True,返回的结果将是频次的相对比例而不是绝对频次。

  • sort:默认为 True,如果设置为 False,结果将按照唯一值的顺序而不是频次降序排序。

  • ascending:默认为 False,如果设置为 True,结果将按照频次升序排序。

  • dropna:默认为 True,如果设置为 False,将包括缺失值(NaN)在内的所有值的频次。

以下是一些示例用法:

  1. 对 Series 使用 value_counts
import pandas as pd

data = pd.Series([12233344NoneNone])

# 计算 Series 中各个值的频次
value_counts = data.value_counts()
print(value_counts)

输出:

3.0    3
2.0    2
4.0    2
1.0    1
dtype: int64

在这个示例中,value_counts 函数计算了 Series 中各个值的频次,忽略了缺失值(None)。

  1. 使用 normalize 参数获取相对频次:
# 计算 Series 中各个值的相对频次
relative_frequency = data.value_counts(normalize=True)
print(relative_frequency)

输出:

3.0    0.375
2.0    0.250
4.0    0.250
1.0    0.125
dtype: float64

在这个示例中,通过将 normalize 参数设置为 True,value_counts 返回了各个值的相对频次(频次的比例)。

value_counts 函数常用于数据探索性分析,可以帮助您了解数据中不同值的分布情况,识别常见值,检查异常值等。

步骤12 一共有多少商品被下单?

# 运行以下代码
total_items_orders = chipo['quantity'].sum()
total_items_orders
4972

步骤13 将item_price转换为浮点数

# 运行以下代码
dollarizer = lambda x: float(x[1:-1])
chipo['item_price'] = chipo['item_price'].apply(dollarizer)

apply 函数是 pandas 中的一个强大工具,用于在 DataFrame 或 Series 上应用自定义函数或内置函数,以进行元素级的操作和转换。apply 函数可以对每个元素、每列或每行数据执行指定的函数,并将结果整合成新的 Series 或 DataFrame。以下是 apply 函数的详细解释和用法:

DataFrame/Series.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

主要参数:

  • func:要应用的函数,可以是自定义函数或内置函数。

  • axis:默认为 0,用于指定函数的应用方向。0 表示按列应用函数,1 表示按行应用函数。

  • raw:默认为 False,如果设置为 True,则将传递原始 NumPy 数组给函数,否则传递 Series 或 DataFrame。

  • result_type:可选参数,指定结果的数据类型,可以是 'expand'(默认)、'reduce' 或 'broadcast'。

  • args**kwds:可选参数,用于传递给函数的额外参数。

以下是一些示例用法:

  1. 对 Series 使用 apply
import pandas as pd

data = pd.Series([12345])

# 定义一个自定义函数,将元素加倍
def double(x):
    return x * 2

# 使用 apply 应用自定义函数
result = data.apply(double)
print(result)

输出:

0     2
1     4
2     6
3     8
4    10
dtype: int64

在这个示例中,我们定义了一个自定义函数 double,然后使用 apply 将该函数应用于 Series 中的每个元素,将每个元素加倍。

  1. 对 DataFrame 使用 apply
data = pd.DataFrame({'A': [123], 'B': [456]})

# 定义一个自定义函数,将每列的平均值乘以 2
def double_mean(column):
    return column.mean() * 2

# 使用 apply 应用自定义函数,按列应用
result = data.apply(double_mean)
print(result)

输出:

A    6.0
B    9.0
dtype: float64

在这个示例中,我们定义了一个自定义函数 double_mean,然后使用 apply 将该函数按列应用于 DataFrame,计算每列的平均值并将结果乘以 2。

apply 函数非常灵活,可以用于各种数据转换和操作,包括数据清理、特征工程和数据分析。

步骤14 在该数据集对应的时期内,收入(revenue)是多少

# 运行以下代码,已经做更正
chipo['sub_total'] = round(chipo['item_price'] * chipo['quantity'],2)
chipo['sub_total'].sum()
39237.02

步骤15 在该数据集对应的时期内,一共有多少订单?

# 运行以下代码
chipo['order_id'].nunique()
1834

步骤16 每一单(order)对应的平均总价是多少?

# 运行以下代码,已经做过更正
chipo[['order_id','sub_total']].groupby(by=['order_id']
).agg({'sub_total':'sum'})['sub_total'].mean()
21.39423118865867

步骤17 一共有多少种不同的商品被售出?

# 运行以下代码
chipo['item_name'].nunique()

50

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值