Python数据分析——Pandas基础:dt.datetime与pivot

Python数据分析——Pandas基础:dt.datetime与pivot,第1张

系列文章目录

Chapter 1:创建与探索DF、排序、子集化:Python数据分析——Pandas基础入门+代码(一)
Chapter 2:聚合函数,groupby,统计分析:Python数据分析——Pandas基础入门+代码(二)
Chapter 3:索引和切片:Python数据分析——Pandas基础入门+代码(三)
Chapter 4:可视化与读写csv文件:Python数据分析——Pandas基础入门+代码(四)
Chapter 5:数据透视表:Python数据分析——Pandas基础入门+代码之数据透视表


文章目录
  • 系列文章目录
  • 前言
  • 时间数据的提取
  • 数据透视表 .pivot_table()
    • Calculating on a pivot table 数据透视表——计算
  • Reference


前言

这一篇主要讲的是:如何用pandas做数据透视表 以及 时间数据上的小处理
一些非常基础的内容,把官方的文档进行了一些解释


时间数据的提取

这里希望我们做一个关于城市温度的年份数据透视表,也就是要先处理一下时间数据。


在dataframe里面,时间数据的处理是用这么一条代码

dataframe["column"].dt.[component]

这个component可以用year, month, day来代替

# 只取年份
dataframe["column"].dt.year

# 只取月份
dataframe["column"].dt.month

# 只取日期
dataframe["column"].dt.day

比如原数据是这样的

In[1]: temperatures["date"]
Out[1]: 
0       2000-01-01
1       2000-02-01
2       2000-03-01
3       2000-04-01
4       2000-05-01
           ...    
16495   2013-05-01
16496   2013-06-01
16497   2013-07-01
16498   2013-08-01
16499   2013-09-01
Name: date, Length: 16500, dtype: datetime64[ns]

然后我们只取年份

In [1]: temperatures["date"].dt.year
Out[1]:
0        2000
1        2000
2        2000
3        2000
4        2000
         ... 
16495    2013
16496    2013
16497    2013
16498    2013
16499    2013
Name: date, Length: 16500, dtype: int64

数据透视表 .pivot_table()

下面整体说下数据透视表DataFrame.pivot_table,以下是官方文档给的

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', 
											fill_value=None, margins=False, dropna=True, 
											margins_name='All', observed=False, sort=True)
ParametersDescription
values要聚合的值,也就是我们要拿来“透视”的值
indexcolumn、Grouper、array或一个list。


也就是我们的索引列,相当于rows

columnscolumn、Grouper、数组或前一个列表。


如果传递的是数组,则它必须与数据的长度相同。


一般来说,输入的都是列标签

aggfunc聚合函数,默认为mean
fill_value是否填充缺失值,默认不填充,填的话可以自己定填什么
margins默认为 False,对添加的所有行/列进行一个总计。


dropna不要包括其条目全部为 NaN 的列。


margins_namestr默认“All”,当margins为 True 时将包含总计的行/列的名称。


observed认为 False,这仅适用于任何分组是分类的。


如果为真:仅显示分类分组的观察值。


如果为假:显示分类分组的所有值。


sort是否排序

给个例子就什么都懂了,相互对应一下。


# Example
# Pivot avg_temp_c by country and city vs year
temp_by_country_city_vs_year = data.pivot_table('avg_temp_c', index = ['country', 'city'], columns = 'year')

# 输出数据集预览
Out[1]:
year                              2000    2001    2002    2003    2004  ...    2009    2010    2011    2012    2013
country       city                                                      ...                                        
Afghanistan   Kabul             15.823  15.848  15.715  15.133  16.128  ...  15.093  15.676  15.812  14.510  16.206
Angola        Luanda            24.410  24.427  24.791  24.867  24.216  ...  24.325  24.440  24.151  24.240  24.554
Australia     Melbourne         14.320  14.180  14.076  13.986  13.742  ...  14.647  14.232  14.191  14.269  14.742
              Sydney            17.567  17.854  17.734  17.592  17.870  ...  18.176  17.999  17.713  17.474  18.090
Bangladesh    Dhaka             25.905  25.931  26.095  25.927  26.136  ...  26.536  26.648  25.803  26.284  26.587
...                                ...     ...     ...     ...     ...  ...     ...     ...     ...     ...     ...
United States Chicago           11.090  11.703  11.532  10.482  10.943  ...  10.298  11.816  11.214  12.821  11.587
              Los Angeles       16.643  16.466  16.430  16.945  16.553  ...  16.677  15.887  15.875  17.090  18.121
              New York           9.969  10.931  11.252   9.836  10.389  ...  10.142  11.358  11.272  11.971  12.164
Vietnam       Ho Chi Minh City  27.589  27.832  28.065  27.828  27.687  ...  27.853  28.282  27.675  28.249  28.455
Zimbabwe      Harare            20.284  20.861  21.079  20.889  20.308  ...  20.524  21.166  20.782  20.523  19.756
Calculating on a pivot table 数据透视表——计算

得到数据透视表后,我们就可以对这个数据透视表进行一些运算。


# 这里就是一些简单的计算了
# Get the worldwide mean temp by year
mean_temp_by_year = temp_by_country_city_vs_year.mean()

# Filter for the year that had the highest mean temp
print(mean_temp_by_year[mean_temp_by_year == mean_temp_by_year.max()])

# Get the mean temp by city
mean_temp_by_city = temp_by_country_city_vs_year.mean(axis="columns")
# 也可以axis = 1 表示的意思一样,跨列计算

# Filter for the city that had the lowest mean temp
print(mean_temp_by_city[mean_temp_by_city == mean_temp_by_city.min()])

因为我们这里都不是用的切片,用切片的话得到的一直还会是dataframe,如果不是切片就会变成series。


那么像第二行代码里面这个,就是一个布尔值。


# 这里就是最大的为true,不是最大的都为False
In [2]:
mean_temp_by_year == mean_temp_by_year.max()
Out[2]:
year
2000    False
2001    False
2002    False
2003    False
2004    False
2005    False
2006    False
2007    False
2008    False
2009    False
2010    False
2011    False
2012    False
2013     True
dtype: bool

我们需要在它外面额外加一个框并贴上原来的dt名称,这样pandas就会去找那个唯一的true值,并输出

In [1]:
mean_temp_by_year[mean_temp_by_year == mean_temp_by_year.max()]
Out[1]:
year
2013    20.312
dtype: float64
Reference

学习网站:Datacamp

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/571671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存