「Python」数据分析奇技淫巧
Matplotlib绘图相关
中文与负数中负号-
的显示:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
plt.rcParams['axes.unicode_minus'] = False # 负号显示
当同时绘制的两组数据差距过大时,可以使用:
plt.yscale('log') # 对y轴进行log缩放,减小两组图视觉上的差异,更方便观察(★★★★★)
进行对数转换,减小不同组数据之间的量级差异。
[photos]
[/photos]
数据透视表三个分组统计函数
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']列的空值完全相等