DataFrame 是 Pandas 的核心数据结构,由数据、列索引与行索引三部分构成。修改行索引名或列索引名,要使用 DataFrame 的 rename() 方法,通用格式如下:
df.rename(
# 修改列索引名的参数
columns={"旧列名1":"新列名1", "旧列名2":"新列名2", ...},
# 修改行索引名的参数
index={"旧行名1":"新行名1", "旧行名2":"新行名2", ...}
)
Pandas 里,绝大多数方法都不改变原始的输入数据,而是生成新的对象。修改前的 DataFrame 我们已经不需要了,直接用修改后的新 DataFrame 代替原有数据,传给变量 df 就可以。
df = df.rename(columns={'Unnamed: 0':'月份'})
print(df)
'''
输出:
月份 2020 2021 2022
0 1 1057066 1315871 1600889.0
1 2 1557372 1236012 1715643.0
2 3 1585905 1807039 1884091.0
...
10 11 1562527 1876472 NaN
11 12 1381485 1703075 NaN
'''
将月份作为行索引,更易于理解。将某一列提取出来作为行索引也有专门的方法:set_index(),括号中填入列名就可以。
df = df.set_index('月份')
print(df)
'''
输出:
2020 2021 2022
月份
1 1057066 1315871 1600889.0
2 1557372 1236012 1715643.0
3 1585905 1807039 1884091.0
...
11 1562527 1876472 NaN
12 1381485 1703075 NaN
'''
Step 2 数据的选取
查看其中的特定数据:列的选取,使用 df['列名'] 的格式,多个列则df[['列名1', '列名2', ...]]
print(df['2021'])
'''
输出:
月份
1 1315871
2 1236012
3 1807039
...
11 1876472
12 1703075
Name: 2021, dtype: int64
'''
选取特定行:用到 DataFrame 的 loc 方法,格式为 df.loc['行名']。选择多行df[['行名1', '行名2', ...]]
# 单行选取,查看二月的数据
print(df.loc[2])
'''
输出:
2020 1557372.0
2021 1236012.0
2022 1715643.0
Name: 2, dtype: float64
'''
行列同时选取:
- 多行多列选取,则会返回 DataFrame;
- 多行单列或单行多列选取,返回 Series;
- 单行单列选取,返回的就是单个值。
# 选取 2021 和 2022 年的第二季度数据(多行多列选取)
print(df.loc[[4, 5, 6], ['2021', '2022']])
'''
输出:
2021 2022
月份
4 1686054 2072804.0
5 1576076 1628067.0
6 1571498 1544610.0
'''
# 选取 2021 年 3 月与 7 月的数据(多行单列)
print(df.loc[[3, 7], '2021'])
'''
输出:
月份
3 1807039
7 1690782
Name: 2021, dtype: int64
'''
# 选取 2021 年 10 月数据(单行单列)
print(df.loc[10, '2021'])
# 输出:1893907
Step 3 列的计算
同比分析
year_on_year = df['2021']/df['2020'] - 1
print(year_on_year)
'''
输出:
月份
1 0.244833
2 -0.206348
3 0.139437
...
11 0.200921
12 0.232786
dtype: float64
'''
将其添加到 df ,作为新增列显示,格式是这样的:df['新列名'] = ...
# 方法一:使用 year_on_year 变量传递值
year_on_year = df['2021']/df['2020'] - 1
df['同比增长'] = year_on_year
# 方法二:直接写进一行
df['同比增长'] = df['2021']/df['2020'] - 1
print(df)
'''
输出:
2020 2021 同比增长
月份
1 1057066 1315871 0.244833
2 1557372 1236012 -0.206348
3 1585905 1807039 0.139437
...
11 1562527 1876472 0.200921
12 1381485 1703075 0.232786
'''
环比分析
对 2021 年每个月份进行环比分析,其实就是求 df['2021'] 这个 Series 中,一个数值与上个数值的相对百分比变化。这个功能,Series 提供了专门的方法:pct_change() ,也就是 percent change 的缩写。我们直接调用,就能得出结果:
df['环比增长'] = df['2021'].pct_change()
print(df)
'''
输出:
2020 2021 同比增长 环比增长
月份
1 1057066 1315871 0.244833 NaN
2 1557372 1236012 -0.206348 -0.060689
3 1585905 1807039 0.139437 0.461991
...
11 1562527 1876472 0.200921 -0.009206
12 1381485 1703075 0.232786 -0.092406
'''
Step 4 完整代码
import pandas as pd
# 设置展示样式的代码,可以忽略
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
path = "/Users/wenwen/Desktop/data-analysis/月活数据.csv"
# 读取 csv 文件并转换成 DataFrame
df = pd.read_csv(path)
# 将第一列名 'Unnamed: 0' 改成 '月份'
df = df.rename(columns={'Unnamed: 0':'月份'})
# 将月份列作为行索引
df = df.set_index('月份')
# 只保留 2020 年和 2021 年的数据
df = df[['2020', '2021']]
# 计算同比增长
df['同比增长'] = df['2021']/df['2020'] - 1
# 计算环比增长
df['环比增长'] = df['2021'].pct_change()
df.loc[1, '环比增长'] = df.loc[1, '2021']/df.loc[12, '2020'] - 1
print(df)
'''
输出:
2020 2021 同比增长 环比增长
月份
1 1057066 1315871 0.244833 -0.047495
2 1557372 1236012 -0.206348 -0.060689
3 1585905 1807039 0.139437 0.461991
...
11 1562527 1876472 0.200921 -0.009206
12 1381485 1703075 0.232786 -0.092406
Step 5 数据筛选
找出同比负增长与环比负增长的月份
year_on_year_down = df.loc[df['同比增长'] < 0, ['2021', '同比增长']]
print(year_on_year_down)
'''
输出:
2021 同比增长
月份
2 1236012 -0.206348
'''
# 选择同比增长数字不小于 0 的行,展示同比增长列
df.loc[df['同比增长']>=0, '同比增长']
# 选择同比增长与环比增长都不小于 0 的行,展示同比增长与环比增长列
df.loc[(df['同比增长']>=0) & (df['环比增长']>=0), ['同比增长', '环比增长']]
# 选择同比增长不小于 0 或环比增长不小于 0 的行,展示同比增长与环比增长列
df.loc[(df['同比增长']>=0) | (df['环比增长']>=0), ['同比增长', '环比增长']]
批量套用函数
def float_to_pct(num):
pct = round(num * 100, 2)
pct_string = '{}%'.format(pct)
return pct_string
print(month_on_month_down['环比增长'].apply(float_to_pct))
'''
输出:
月份
1 -4.75%
2 -6.07%
...
11 -0.92%
12 -9.24%
Name: 环比增长, dtype: object
'''
# 筛选同比负增长的月份
year_on_year_down = df.loc[df['同比增长'] < 0, ['2021', '同比增长']]
# 筛选环比负增长的月份
month_on_month_down = df.loc[df['环比增长'] < 0, ['2021', '环比增长']]
# 定义浮点数转百分数的函数
def float_to_pct(num, n):
pct = round(num * 100, n)
pct_string = '{}%'.format(pct)
return pct_string
# 批量将数字转为百分数
year_on_year_down['同比增长'] = year_on_year_down['同比增长'].apply(float_to_pct, n=2)
month_on_month_down['环比增长'] = month_on_month_down['环比增长'].apply(float_to_pct, n=2)
# 打印结果
print('-----------------------')
print(year_on_year_down)
print('-----------------------')
print(month_on_month_down)
print('-----------------------')
使用专业绘图库 Plotly
from plotly import express
fig = express.line(df[['同比增长', '环比增长']] * 100, x =df.index, y=['同比增长', '环比增长'])
fig.update_traces(mode='lines markers', line_dash='dot',hovertemplate='%{y:.2f}')
fig.update_traces(line_color='#fda161', selector={'name':'同比增长'})
fig.update_traces(line_color='#3cd3ef',selector={'name':'环比增长'})
fig.update_layout(
legend_title='',
xaxis=dict(tickvals=list(range(1, 13)),showgrid=False),
yaxis=dict(title='增长(%)', showgrid=False, zeroline=True, zerolinecolor='grey', zerolinewidth=0.2),
)
fig.show()