酒类消费数据
给定一个某段时间内各个国家的酒类消费数据表drinks.csv,其中包含6个字段,表8-1
给出了该表中的字段信息。
表8-1酒类消费数据表的字段信息
| Country | 国家 |
| beer_servings | 啤酒消费量 |
| spirit_servings | 烈酒消费量 |
| wine_servings | 红酒消费量 |
| total_litres_of_pure_alcohol | 纯酒精消费总量 |
| Continent | 所在的大洲 |
完成以下的任务:
- # 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
- def read_drinks_data():
- return pd.read_csv('drinks.csv', keep_default_na=False)
- 使用
pd.read_csv('drinks.csv', index_col=False)读取数据,这可以避免 Pandas 将第一列识别为索引列。- 设置
pd.set_option('display.max_rows', None)和pd.set_option('display.max_columns', None)来显示全部数据。- 如果数据量非常大,您也可以考虑使用
chunksize参数分块读取数据,或者使用head()或tail()等方法查看部分数据。
- def get_max_value_and_country(df, column_name):
- max_value = df[column_name].max()
- max_row = df[df[column_name] == max_value]
- return max_row['country'].values[0], max_value
- def print_continent_totals(df_continent):
- for name, group in df_continent:
- print(name)
- print(group['beer_servings'].sum(), group['spirit_servings'].sum(), group['wine_servings'].sum())
- print()
- import pandas as pd
-
-
- # 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
- def read_drinks_data():
- return pd.read_csv('drinks.csv', keep_default_na=False)
-
-
- # 计算最大
- def get_max_value_and_country(df, column_name):
- max_value = df[column_name].max()
- max_row = df[df[column_name] == max_value]
- return max_row['country'].values[0], max_value
-
-
- # 计算总数
- def print_continent_totals(df_continent):
- for name, group in df_continent:
- print(name)
- print(group['beer_servings'].sum(), group['spirit_servings'].sum(), group['wine_servings'].sum())
- print()
-
-
- def main():
- data = read_drinks_data()
- df = pd.DataFrame(data)
- df_continent = df.groupby(df['continent'])
-
- print_continent_totals(df_continent)
-
- max_beer_country, max_beer_servings = get_max_value_and_country(df, 'beer_servings')
- print(max_beer_country, max_beer_servings)
-
- max_spirit_country, max_spirit_servings = get_max_value_and_country(df, 'spirit_servings')
- print(max_spirit_country, max_spirit_servings)
-
- max_wine_country, max_wine_servings = get_max_value_and_country(df, 'wine_servings')
- print(max_wine_country, max_wine_servings)
-
-
- if __name__ == "__main__":
- main()
Pandas 在读取 CSV 文件时会自动将缺失值识别为 NaN (Not a Number)。这是 Pandas 的一个默认行为,主要有以下几个原因
统一数据类型:将缺失值统一识别为 NaN 可以确保整个 DataFrame 的数据类型是统一的,这有助于后续的数据处理和分析。
方便处理缺失数据:识别缺失值为 NaN 可以让我们更方便地使用 Pandas 提供的一些函数和方法,如 dropna()、fillna() 等,来处理缺失数据。
与数值计算兼容:NaN 值在数值计算时会被自动忽略,这可以避免一些计算错误。
如果您不希望 Pandas 自动将缺失值识别为 NaN,可以尝试以下方法:
1. 使用 na_values 参数指定缺失值的表示形式:
df = pd.read_csv('drinks.csv', na_values=['missing', 'unknown'])
在这个例子中,Pandas 会将 'missing' 和 'unknown' 这两个值识别为缺失值。
2.使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为:
df = pd.read_csv('drinks.csv', keep_default_na=False)
这样 Pandas 就不会自动将空值识别为 NaN,而是会保留原始值。
3.自定义缺失值标记:
df = pd.read_csv('drinks.csv', na_filter=True, na_values='-999')
在这个例子中,Pandas 会将 '-999' 视为缺失值。
Pandas 对 DataFrame
df进行分组操作,具体分析如下:
df['continent'] 是用来选择 DataFrame df 中名为 'continent' 的列。
df.groupby(df['continent']) 将 DataFrame df 按照 'continent' 列的值进行分组。这个操作返回一个 DataFrameGroupBy 对象。
将这个 DataFrameGroupBy 对象赋值给变量 df_continent。
这个操作的目的是将原始 DataFrame 按照 'continent' 列的值划分成多个组,每个组包含了原始 DataFrame 中与该 'continent' 值对应的行。
这样做的好处是可以对这些分组进行后续的数据分析和处理,比如:
要打印 df_continent 这个 DataFrameGroupBy 对象,可以使用以下方法:
- for name, group in df_continent:
- print(f"Continent: {name}")
- print(group)
- print()
这个方法会逐个打印每个分组的 DataFrame。name 变量保存的是分组的键值(即 'continent' 列的值),而 group 变量保存的是该分组对应的 DataFrame。
groups 属性查看分组的键值:print(df_continent.groups)
这将打印出一个字典,键为分组的键值,值为对应分组中行的索引。
- africa_group = df_continent.get_group('Africa')
- print(africa_group)
这将打印出 'continent' 列值为 'Africa' 的那个分组的 DataFrame。
describe() 方法打印分组的汇总统计信息:print(df_continent.describe())
这将打印出每个分组的汇总统计信息,比如平均值、标准差、最小值等。