0.关于显示的问题
#显示所有列
pd.set_option(‘display.max_columns’, None) # 可以把None 改成你想要最多显示的 大小
#显示所有行
pd.set_option(‘display.max_rows’, None) # 可以把None 改成你想要最多显示的 大小
1. 从列表创建 Series
arr = [0, 1, 2, 3, 4]
s1 = pd.Series(arr) # 如果不指定索引,则默认从 0 开始
0 0
1 1
2 2
3 3
4 4
dtype: int64
2. 从 Ndarray 创建 Series
import numpy as np
n = np.random.randn(5) # 创建一个随机 Ndarray 数组
index = ['a', 'b', 'c', 'd', 'e']
s2 = pd.Series(n, index=index)
a -1.713919
b 0.954737
c -1.070564
d -2.258011
e -0.324233
dtype: float64
3. 从字典创建 Series
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
s3 = pd.Series(d)
a 1
b 2
c 3
d 4
e 5
dtype: int64
Series 基本操作
6. 修改 Series 索引
s1.index = ['A', 'B', 'C', 'D', 'E'] # 修改后的索引
A 0
B 1
C 2
D 3
E 4
dtype: int64
7. Series 纵向拼接
s4 = s3.append(s1) # 将 s1 拼接到 s3
a 1
b 2
c 3
d 4
e 5
A 0
B 1
C 2
D 3
E 4
8. Series 按指定索引删除元素
s4 = s4.drop('e') # 删除索引为 e 的值
创建 DataFrame 数据类型
20. 通过 NumPy 数组创建 DataFrame
dates = pd.date_range('today', periods=6) # 定义时间序列作为 index
num_arr = np.random.randn(6, 4) # 传入 numpy 随机数组
columns = ['A', 'B', 'C', 'D'] # 将列表作为列名
df1 = pd.DataFrame(num_arr, index=dates, columns=columns)
21. 通过字典数组创建 DataFrame
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df2 = pd.DataFrame(data, index=labels)
22. 查看 DataFrame 的数据类型
df2.dtypes
animal object
age float64
visits int64
priority object
dtype: object
23. 预览 DataFrame 的前 5 行数据
df2.head() # 默认为显示 5 行,可根据需要在括号中填入希望预览的行数
24. 查看 DataFrame 的后 3 行数据
df2.tail(3)
25.查看 DataFrame 的索引
df2.index
Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], dtype='object')
26. 查看 DataFrame 的列名
df2.columns
Index(['animal', 'age', 'visits', 'priority'], dtype='object')
27. 查看 DataFrame 的数值
df2.values
array([['cat', 2.5, 1, 'yes'],
['cat', 3.0, 3, 'yes'],
['snake', 0.5, 2, 'no'],
['dog', nan, 3, 'yes'],
['dog', 5.0, 2, 'no'],
['cat', 2.0, 3, 'no'],
['snake', 4.5, 1, 'no'],
['cat', nan, 1, 'yes'],
['dog', 7.0, 2, 'no'],
['dog', 3.0, 1, 'no']], dtype=object)
28. 查看 DataFrame 的统计数据
df2.describe()
29. DataFrame 转置操作
df2.T
30. 对 DataFrame 进行按列排序
df2.sort_values(by='age') # 按 age 升序排列
31. 对 DataFrame 数据切片
df2[1:3] # 默认对行切片
32. 对 DataFrame 通过标签查询(单列)
df2['age']
df2.age # 等价于 df2['age']
a 2.5
b 3.0
c 0.5
d NaN
e 5.0
f 2.0
g 4.5
h NaN
i 7.0
j 3.0
Name: age, dtype: float64
33. 对 DataFrame 通过标签查询(多列)
df2[['age', 'animal']] # 传入一个列名组成的列表
34. 对 DataFrame 通过位置查询
df2.iloc[1:3] # 查询 2,3 行
35. DataFrame 副本拷贝
- 生成 DataFrame 副本,方便数据集被多个不同流程使用
df3 = df2.copy()
36. 判断 DataFrame 元素是否为空
- 如果为空则返回为 True
df3.isnull()
37. 添加列数据
num = pd.Series([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], index=df3.index)
df3['No.'] = num # 添加以 'No.' 为列名的新数据列
38. 根据 DataFrame 的下标值进行更改。
# 修改第 2 行与第 2 列对应的值 3.0 → 2.0
df3.iat[2, 2] = 100 # 索引序号从 0 开始,这里为 1, 1
39. 根据 DataFrame 的标签对数据进行修改
df3.loc['f', 'age'] = 1.5
40. DataFrame 求平均值操作
df3.mean()
41. 对 DataFrame 中任意列做求和操作
df3['visits'].sum()
字符串操作
string = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
np.nan, 'CABA', 'dog', 'cat'])
print(string)
string.str.lower()
0 A
1 B
2 C
3 Aaba
4 Baca
5 NaN
6 CABA
7 dog
8 cat
---------------
0 a
1 b
2 c
3 aaba
4 baca
5 NaN
6 caba
7 dog
8 cat
43. 将字符串转化为大写字母
string.str.upper()
DataFrame 缺失值操作
44. 对缺失值进行填充
df4.fillna(value=3)
45. 删除存在缺失值的行
- any 存在一个就删除 all 全部不存在才删除
df5.dropna(how='any') # 任何存在 NaN 的行都将被删除
46. DataFrame 按指定列对齐
left = pd.DataFrame({'key': ['foo1', 'foo2'], 'one': [1, 2]})
right = pd.DataFrame({'key': ['foo2', 'foo3'], 'two': [4, 5]})
print(left)
print(right)
# 按照 key 列对齐连接,只存在 foo2 相同,所以最后变成一行
pd.merge(left, right, on='key')
DataFrame 文件操作
- Excel 的读取和csv的文件操作类似
48. CSV 文件读取
df_animal = pd.read_csv('animal.csv')
47. CSV 文件写入
df3.to_csv('animal.csv')
进阶部分
时间序列索引
51. 建立一个以 2018 年每一天为索引,值为随机数的 Series
date = pd.date_range(start='2019-08-19',end='2019-08-25') # 创建日期
s = pd.DataFrame(np.random.rand(len(date),2),index=date) # 创建数据
52. 选择s
中的周三
# 周一从 0 开始
s[s.index.weekday == 2]
53. 统计s
中每个月值的平均值
s.resample('M').mean()
54. 将 Series 中的时间进行转换(秒转分钟)
- 创建一个DataFrame
s = pd.date_range('today', periods=100, freq='S') # freq='S'以一秒为一个单位
ts = pd.Series(np.random.randint(0, 500, len(s)), index=s)
ts.resample('Min').sum()
57.不同时间表示方式的转换
rng = pd.date_range('1/1/2018', periods=5, freq='M')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
ps = ts.to_period()
ps.to_timestamp()
Series 多重索引
58. 创建多重索引 Series
构建一个 letters = ['A', 'B', 'C']
和 numbers = list(range(10))
为索引,值为随机数的多重索引 Series。
letters = ['A', 'B', 'C'] # 第一重索引
numbers = list(range(5)) # 第二重索引
mi = pd.MultiIndex.from_product([letters, numbers]) # 设置多重索引
s = pd.Series(np.random.rand(15), index=mi) # 随机数
59. 多重索引 Series 查询
# 查询索引为 1,3,6 的值
s.loc[:, [1, 3, 6]]
60. 多重索引 Series 切片
s.loc[pd.IndexSlice[:'B', 5:]]
DataFrame 多重索引
61. 根据多重索引创建 DataFrame
创建一个以 letters = ['A', 'B']
和 numbers = list(range(6))
为索引,值为随机数据的多重索引 DataFrame。
frame = pd.DataFrame(np.arange(12).reshape(6, 2),
index=[list('AAABBB'), list('123123')],
columns=['hello', 'linux'])
62. 多重索引设置列名称
frame.index.names = ['letter','score']
63. DataFrame 多重索引分组求和
frame.groupby('letter').sum()
64. DataFrame 行列名称转换
frame.stack()
65. DataFrame 索引转换
print(frame)
frame.unstack()
66. DataFrame 条件查找
# 示例数据
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data, index=labels)
查找 age
大于 3
的全部信息
df[df['age'] > 3]
67. 根据行列索引切片
df.iloc[2:4, 1:3]
68. DataFrame 多重条件查询
查找 age<3
且为 cat
的全部数据。
- 注意必须要用
()
把条件都括起来,并且用&
连接起来
df = pd.DataFrame(data, index=labels)
df[(df['animal'] == 'cat') & (df['age'] < 3)]
69. DataFrame 按关键字查询
df3 = df.copy()
df3[df3['animal'].isin(['cat', 'dog'])]
70. DataFrame 按标签及列名查询。
df.loc[df2.index[[3, 4, 8]], ['animal', 'age']]
71. DataFrame 多条件排序
按照 age
降序,visits
升序排列
- ascending=[False, True] False 是降序 True是升序
df.sort_values(by=['age', 'visits'], ascending=[False, True])
72.DataFrame 多值替换
将 priority
列的 yes
值替换为 True
,no
值替换为 False
。
df['priority'] = df['priority'].map({'yes': True, 'no': False})
73. DataFrame 分组求和
df4.groupby('animal').sum()
74. 使用列表拼接多个 DataFrame
temp_df1 = pd.DataFrame(np.random.randn(5, 4)) # 生成由随机数组成的 DataFrame 1
temp_df2 = pd.DataFrame(np.random.randn(5, 4)) # 生成由随机数组成的 DataFrame 2
temp_df3 = pd.DataFrame(np.random.randn(5, 4)) # 生成由随机数组成的 DataFrame 3
print(temp_df1)
print(temp_df2)
print(temp_df3)
pieces = [temp_df1, temp_df2, temp_df3]
pd.concat(pieces,axis=0) # 按行滑动 axis=1 是按列滑动
75. 找出 DataFrame 表中和最小的列
- 返会列名
df = pd.DataFrame(np.random.random(size=(5, 5)), columns=list('abcde'))
print(df)
df.sum().idxmin() # idxmax(), idxmin() 为 Series 函数返回最大最小值的索引值
77. DataFrame 分组,并得到每一组中最大三个数之和
- level = 如果轴是MultiIndex(分层),则沿特定级别计数,折叠为系列。
df = pd.DataFrame({'A': list('aaabbcaabcccbbc'),
'B': [12, 345, 3, 1, 45, 14, 4, 52, 54, 23, 235, 21, 57, 3, 87]})
df.groupby('A')['B'].nlargest(3).sum(level=0)
透视表
当分析庞大的数据时,为了更好的发掘数据特征之间的关系,且不破坏原数据,就可以利用透视表 pivot_table
进行操作。
78. 透视表的创建
新建表将 A, B, C
列作为索引进行聚合。
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
'B': ['A', 'B', 'C'] * 4,
'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D': np.random.randn(12),
'E': np.random.randn(12)})
df
# 根据列 进行聚合 然后变成行名
pd.pivot_table(df, index=['A', 'B'])
79. 透视表按指定行进行聚合
将该 DataFrame 的 D
列聚合,按照 A,B
列为索引进行聚合,聚合的方式为默认求均值。
pd.pivot_table(df, values=['D'], index=['A', 'B'])
80. 透视表聚合方式定义
上一题中 D
列聚合时,采用默认求均值的方法,若想使用更多的方式可以在 aggfunc
中实现。
pd.pivot_table(df, values=['D'], index=['A', 'B'], aggfunc=[np.sum, len])
81. 透视表利用额外列进行辅助分割
D
列按照 A,B
列进行聚合时,若关心 C
列对 D
列的影响,可以加入 columns
值进行分析。
``python
pd.pivot_table(df, values=[‘D’], index=[‘A’, ‘B’],
columns=[‘C’], aggfunc=np.sum)
#### 82. 透视表的缺省值处理
在透视表中由于不同的聚合方式,相应缺少的组合将为缺省值,可以加入 `fill_value` 对缺省值处理。
```python
pd.pivot_table(df, values=['D'], index=['A', 'B'],
columns=['C'], aggfunc=np.sum, fill_value=0)