Matplotlib绘图相关

中文与负数中负号-的显示:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示
plt.rcParams['axes.unicode_minus'] = False  # 负号显示

当同时绘制的两组数据差距过大时,可以使用:

plt.yscale('log')  # 对y轴进行log缩放,减小两组图视觉上的差异,更方便观察(★★★★★)

进行对数转换,减小不同组数据之间的量级差异。

处理前
处理前
处理后
处理后

数据透视表三个分组统计函数

size()sum()count()三个统计函数,能分别统计分组数量、不同列的分组和、不同列的分组数量。举个栗子:

import pandas as pd

df = pd.DataFrame({
    'key1': ['a', 'a', 'b', 'b', 'a'],
    'key2': ['one', 'two', 'one', 'two', 'one'],
    'x': np.random.randn(5),
    'y': np.random.randn(5)})
df

Out[4]: 
  key1 key2         x         y
0    a  one -0.343202  0.992670
1    a  two -0.996222 -0.181044
2    b  one  1.380729  1.091965
3    b  two  0.520865 -1.400465
4    a  one -0.635766 -1.154578

count()

首先是count()函数,这个函数真的就是数数的,类似于pd.Series.value_counts()

df.groupby('key1').count()  # key1列下面有3个a,2个b
Out[5]: 
      key2  x  y
key1            
a        3  3  3
b        2  2  2

df.groupby(['key1', 'key2']).count()  # key1列和key2列的values共有四种随机组合:a-one、a-two、:b-one、b-two,然后数一数他们的个数。
Out[6]: 
           x  y
key1 key2      
a    one   2  2
     two   1  1
b    one   1  1
     two   1  1
    
df.key1.value_counts()  # 等同于pd.Series.value_counts()
Out[7]: 
a    3
b    2
Name: key1, dtype: int64

​ 所以综上所述,分组聚合时,使用count()函数好像根本没有意义~

sum()

不同于无聊的count()函数,sum()函数在分组聚合中感觉还是有点用的:

df.groupby('key1').sum()  # 将df按照key1列的value分份儿,然后求和。
Out[8]:   # x列对应key1=a的value和为-1.975191,y列对应key1=b的value和为-0.308500
             x         y
key1                    
a    -1.975191 -0.342953
b     1.901594 -0.308500

df.groupby(['key1', 'key2']).sum()  # 将df按照key1、key2列value的随机组合分份儿,然后求和。
Out[9]: # x列对应key1=a、key2=one的value和为-0.978968,y列对应key1=b、key2=two的value和为-1.400465
                  x         y
key1 key2                    
a    one  -0.978968 -0.161908
     two  -0.996222 -0.181044
b    one   1.380729  1.091965
     two   0.520865 -1.400465

size()

size()函数,顾名思义,就是求大小,这个大小不是指数值上的大小,而是个数上的大小。

df.groupby('key1').size()  # 先看key1列有几个value,然后看每个value有几行。
Out[10]: 
key1
a    3
b    2
dtype: int64

df.groupby(['key1', 'key2']).size()  # 先看key1列与key2value的随机组合有几个,然后看每个组合有几行。
Out[11]: 
key1  key2
a     one     2
      two     1
b     one     1
      two     1
dtype: int64

修改行索引列名称的方法

# 方法一
df.rename_axis('Index', inplace=True)
# 方法二
df.index.name = 'Index'

提取时间格式列中的月份

In [8]: demo = pd.DataFrame({
   ...:     'date': ['2022-07-23', '2021-07-23']
   ...: })
   ...: demo['date'] = pd.to_datetime(demo['date'])
   ...: demo['astype'] = demo['date'].astype('datetime64[M]')
   ...: demo['dt.month'] = demo['date'].dt.month
   ...: demo

Out[8]:
        date     astype  dt.month
0 2022-07-23 2022-07-01         7
1 2021-07-23 2021-07-01         7

注意看两种提取方式的不同,一种可以把不同年份的月份都单独提取出来,另一种只能提取出来月份的数字。

验证三列数据中对应行是否都是NaN

nan_01 = pd.isna(df['Coupon_id'])
nan_02 = pd.isna(df['Discount_rate'])
nan_03 = pd.isna(df['Date_received'])

np.all(nan_01 == nan_03) and np.all(nan_01 == nan_02)   # 说明df['Coupon_id']列与df['Date_received']列的空值完全相等