# 玩转数据处理120题｜Pandas版本

Pandas进阶修炼120题系列一共涵盖了数据处理、计算、可视化等常用操作，希望通过120道精心挑选的习题吃透pandas。并且针对部分习题给出了 多种解法与注解
，动手敲一遍代码一定会让你有所收获！

1

：将下面的字典创建为DataFrame

data = {"grammer":["Python","C","Java","GO",np.nan,"SQL","PHP","Python"],"score":[1,2,np.nan,4,5,6,7,10]}

：:star:

Python解法

import numpy as npimport pandas as pddf = pd.DataFrame(data)# 假如是直接创建df = pd.DataFrame({"grammer": ["Python","C","Java","GO",np.nan,"SQL","PHP","Python"],"score": [1,2,np.nan,4,5,6,7,10]})

2

：提取含有字符串 “Python”

：:star::star:

grammer  score0 Python    1.07 Python   10.0

Python解法

#> 1df[df['grammer'] == 'Python']#> 2results = df['grammer'].str.contains("Python")results.fillna(value=False,inplace = True)df[results]

3

：输出df的所有列名

:star:

Index(['grammer', 'score'], dtype='object')

Python解法

df.columns

4

：修改第二列列名为 ‘popularity’

：:star::star:

Python解法

df.rename(columns={'score':'popularity'}, inplace = True)

5

：统计 grammer

：:star::star:

Python解法

df['grammer'].value_counts()

6

：将空值用上下值的平均值填充

:star::star::star:

Python解法

# pandas里有一个插值方法，就是计算缺失值上下两数的均值df['popularity'] = df['popularity'].fillna(df['popularity'].interpolate())

7

：提取 popularity

：:star::star:

Python解法

df[df['popularity'] > 3]

8

：按照 grammer

:star::star:

Python解法

df.drop_duplicates(['grammer'])

9

：计算 popularity

:star::star:

Python解法

df['popularity'].mean()# 4.75

10

：将 grammer

:star::star:

Python解法

df['grammer'].to_list()# ['Python', 'C', 'Java', 'GO', nan, 'SQL', 'PHP', 'Python']

11

：将DataFrame保存为EXCEL

:star::star:

Python解法

df.to_excel('filename.xlsx')

12

：查看数据行列数

:star:

Python解法

df.shape# (8, 2)

13

：提取 popularity

:star::star:

Python解法

df[(df['popularity'] > 3) & (df['popularity'] < 7)]

14

：交换两列位置

:star::star::star:

Python解法

temp = df['popularity']df.drop(labels=['popularity'], axis=1,inplace = True)df.insert(0, 'popularity', temp)

15

：提取 popularity

:star::star:

Python解法

df[df['popularity'] == df['popularity'].max()]

16

：查看最后5行数据

:star:

Python解法

df.tail()

17

：删除最后一行数据

:star:

Python解法

df = df.drop(labels=df.shape[0]-1)

18

：添加一行数据[ ‘Perl’
,
6.6]

:star::star:

Python解法

row = {'grammer':'Perl','popularity':6.6}df = df.append(row,ignore_index=True)

19

：对数据按照 “popularity”

:star::star:

Python解法

df.sort_values("popularity",inplace=True)

20

：统计 grammer

:star::star::star:

Python解法

df['grammer'] = df['grammer'].fillna('R')df['len_str'] = df['grammer'].map(lambda x: len(x))

21

：读取本地EXCEL数据

:star:

Python解法

import pandas as pdimport numpy as npdf = pd.read_excel(r'C:\Users\chenx\Documents\Data Analysis\pandas120.xlsx')

21—50部分习题与该数据相关

22

：查看df数据前5行

:star:

Python解法

df.head()

23

：将

salary

:star::star::star::star:

Python解法

# 方法一：apply + 自定义函数def func(df):    lst = df['salary'].split('-')    smin = int(lst[0].strip('k'))    smax = int(lst[1].strip('k'))    df['salary'] = int((smin + smax) / 2 * 1000)return dfdf = df.apply(func,axis=1)# 方法二：iterrows + 正则import refor index,row in df.iterrows():    nums = re.findall('\d+',row[2])    df.iloc[index,2] = int(eval(f'({nums[0]} + {nums[1]}) / 2 * 1000'))

24

：将数据根据学历进行分组并计算平均薪资

:star::star::star:

education salary            不限 19600.000000大专 10000.000000本科 19361.344538硕士 20642.857143

Python解法

df.groupby('education').mean()

25

：将

createTime

:star::star::star:

Python解法

for index,row in df.iterrows():   df.iloc[index,0] = df.iloc[index,0].to_pydatetime().strftime("%m-%d")

26

：查看索引、数据类型和内存信息

:star:

<class 'pandas.core.frame.DataFrame'>RangeIndex: 135 entries, 0 to 134Data columns (total 4 columns):createTime 135 non-null objecteducation 135 non-null objectsalary 135 non-null int64categories 135 non-null categorydtypes: category(1), int64(1), object(2)memory usage: 3.5+ KB

Python解法

df.info()

27

：查看数值型列的汇总统计

:star:

Python解法

df.describe()

R解法

summary(df)

28

：新增一列根据salary将数据分为三组

:star::star::star::star:

Python解法

bins = [0,5000, 20000, 50000]group_names = ['低', '中', '高']df['categories'] = pd.cut(df['salary'], bins, labels=group_names)

29

：按照 salary

:star::star:

Python解法

df.sort_values('salary', ascending=False)

3
0

：取出第33行数据

:star::star:

Python解法

df.iloc[32]

31

：计算

salary

:star::star:

Python解法

np.median(df['salary'])# 17500.0

32

：绘制薪资水平频率分布直方图

:star::star::star:

Python解法

# Jupyter运行matplotlib成像需要运行魔术命令%matplotlib inlineplt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码plt.rcParams['axes.unicode_minus'] = False # 解决符号问题import matplotlib.pyplot as pltplt.hist(df.salary)# 也可以用原生pandas方法绘图df.salary.plot(kind='hist')

33

：绘制薪资水平密度曲线

:star::star::star:

Python解法

df.salary.plot(kind='kde',xlim = (0,70000))

34

：删除最后一列 categories

:star:

Python解法

del df['categories']# 等价于df.drop(columns=['categories'], inplace=True)

35

：将df的第一列与第二列合并为新的一列

:star::star:

Python解法

df['test'] = df['education'] + df['createTime']

36

:star::star::star:

sala
ry为int类型，操作与35题有所不同

Python解法

df["test1"] = df["salary"].map(str) + df['education']

37

：计算salary最大值与最小值之差

:star::star::star:

Python解法

df[['salary']].apply(lambda x: x.max() - x.min())# salary 41500# dtype: int64

38

：将第一行与最后一行拼接

:star::star:

Python解法

pd.concat([df[1:2], df[-1:]])

39

：将第8行数据添加至末尾

:star::star:

Python解法

df.append(df.iloc[7])

40

：查看每列的数据类型

:star:

createTime objecteducation objectsalary int64test objecttest1 objectdtype: object

Python解法

df.dtypes# createTime object# education object# salary int64# test object# test1 object# dtype: object

41

：将
c
r
e
a
t
e
T
i
m
e

:star::star:

Python解法

df.set_index("createTime")

42

：生成一个和df长度相同的随机数dataframe

:star::star:

Python解法

df1 = pd.DataFrame(pd.Series(np.random.randint(1, 10, 135)))

43

：将上一题生成的dataframe与df合并

:star::star:

Python解法

df= pd.concat([df,df1],axis=1)

44

：生成新的一列
new

salary

:star::star:

Python解法

df["new"] = df["salary"] - df[0]

45

：检查数据中是否含有任何缺失值

:star::star::star:

Python解法

df.isnull().values.any()# False

46

：将
salary

:star::star::star:

Python解法

df['salary'].astype(np.float64)

47

：计算
salary

:star::star:

Python解法

len(df[df['salary'] > 10000])# 119

48

：查看每种学历出现的次数

:star::star::star:

本科 119硕士 7不限 5大专 4Name: education, dtype: int64

Python解法

df.education.value_counts()

49

：查看
education

:star::star:

Python解法

df['education'].nunique()# 4

50

：提取
salary

new

:star::star::star::star:

Python解法

rowsums = df[['salary','new']].apply(np.sum, axis=1)res = df.iloc[np.where(rowsums > 60000)[0][-3:], :]

51

：使用绝对路径读取本地Excel数据

:star:

Python解法

import pandas as pdimport numpy as npdf = pd.read_excel(r'C:\Users\chenx\Documents\Data Analysis\Pandas51-80.xls')

#### 备注

52

：查看数据前三行

:star:

Python解法

df.head(3)

53

：查看每列数据缺失值情况

:star: :star:

代码 1简称 2日期 2前收盘价(元) 2开盘价(元) 2最高价(元) 2最低价(元) 2收盘价(元) 2成交量(股) 2成交金额(元) 2.................

Python解法

df.isnull().sum()

54

：提取日期列含有空值的行

:star: :star:

Python解法

df[df['日期'].isnull()]

55

：输出每列缺失值具体行数

:star:
:star: :star:

列名："代码", 第[327]行位置有缺失值列名："简称", 第[327, 328]行位置有缺失值列名："日期", 第[327, 328]行位置有缺失值列名："前收盘价(元)", 第[327, 328]行位置有缺失值列名："开盘价(元)", 第[327, 328]行位置有缺失值列名："最高价(元)", 第[327, 328]行位置有缺失值列名："最低价(元)", 第[327, 328]行位置有缺失值列名："收盘价(元)", 第[327, 328]行位置有缺失值................

Python解法

for i in df.columns:if df[i].count() != len(df):        row = df[i][df[i].isnull().values].index.tolist()print('列名："{}", 第{}行位置有缺失值'.format(i,row))

56

：删除所有存在缺失值的行

:star: :star:

Python解法

df.dropna(axis=0, how='any', inplace=True)

#### 备注

axis：0-行操作（默认），1-列操作how：any-只要有空值就删除（默认），all-全部为空值才删除inplace：False-返回新的数据集（默认），True-在原数据集上操作

57

：绘制收盘价的折线图

:star: :star:

Python解法

# Jupyter运行matplotlib%matplotlib inlinedf['收盘价(元)'].plot()# 等价于import matplotlib.pyplot as pltplt.plot(df['收盘价(元)'])

58

：同时绘制开盘价与收盘价

:star:
:star: :star:

Python解法

plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码plt.rcParams['axes.unicode_minus'] = False # 解决符号问题df[['收盘价(元)','开盘价(元)']].plot()

59

：绘制涨跌幅的直方图

:star: :star:

Python解法

plt.hist(df['涨跌幅(%)'])# 等价于df['涨跌幅(%)'].hist()

60

：让直方图更细致

:star: :star:

Python解法

df['涨跌幅(%)'].hist(bins = 30)

61

:star: :star:

Python解法

temp = pd.DataFrame(columns = df.columns.to_list())

62

:star:
:star: :star:

Python解法

for index,row in df.iterrows():if type(row[13]) != float:        temp = temp.append(df.loc[index])

63

:star:
:star: :star:

Python解法

df[df['换手率(%)'] == '--']

#### 备注

64

:star:

Python解法

df = df.reset_index(drop=True)

#### 备注

65

:star:
:star: :star:

Python解法

lst = []for index,row in df.iterrows():if type(row[13]) != float:        lst.append(index)df.drop(labels=lst,inplace=True)

66

:star:
:star: :star:

Python解法

df['换手率(%)'].plot(kind='kde',xlim=(0,0.6))

67

:star: :star:

Python解法

df['收盘价(元)'].diff()

68

:star: :star:

Python解法

data['收盘价(元)'].pct_change()

69

:star:

Python解法

df.set_index('日期')

70

:star: :star:
:star:

Python解法

df['收盘价(元)'].rolling(5).mean()

71

:star: :star:
:star:

Python解法

df['收盘价(元)'].rolling(5).sum()

72

:star: :star:
:star:

Python解法

df['收盘价(元)'].plot()df['收盘价(元)'].rolling(5).mean().plot()df['收盘价(元)'].rolling(20).mean().plot()

73

难度

:star: :star:
:star:

Python解法

df = df.set_index('日期')df['收盘价(元)'].resample('W').max()

74

难度

:star: :star:
:star:

期望结果

Python解法

df['收盘价(元)'].plot()df['收盘价(元)'].resample('7D').max().plot()

75

：将数据往后移动5天

:star: :star:

Python解法

df.shift(5)

76

：将数据向前移动5天

:star: :star:

Python解法

df.shift(-5)

77

：使用expending函数计算开盘价的移动窗口均值

:star: :star:

Python解法

df['开盘价(元)'].expanding(min_periods=1).mean()

78

：绘制上一题的移动均值与原始数据折线图

:star:
:star: :star:

Python解法

df['expanding Open mean']=df['开盘价(元)'].expanding(min_periods=1).mean()df[['开盘价(元)', 'expanding Open mean']].plot(figsize=(16, 6))

79

：计算布林指标

:star:
:star: :star:
:star:

Python解法

df['former 30 days rolling Close mean']=df['收盘价(元)'].rolling(20).mean()df['upper bound']=df['former 30 days rolling Close mean']+2*df['收盘价(元)'].rolling(20).std()df['lower bound']=df['former 30 days rolling Close mean']-2*df['收盘价(元)'].rolling(20).std()

80

：计算 布林线

:star:
:star: :star:

Python解法

df[['收盘价(元)', 'former 30 days rolling Close mean','upper bound','lower bound' ]].plot(figsize=(16, 6))

81

：导入并查看pandas与numpy版本

:star:

Python解法

import pandas as pdimport numpy as npprint(np.__version__)# 1.16.5print(pd.__version__)# 0.25.1

82

：从NumPy数组创建DataFrame

:star:

Python解法

tem = np.random.randint(1,100,20)df1 = pd.DataFrame(tem)

83

：从NumPy数组创建DataFrame

:star:

Python解法

tem = np.arange(0,100,5)df2 = pd.DataFrame(tem)

84

：从NumPy数组创建DataFrame

:star:

Python解法

tem = np.random.normal(0, 1, 20)df3 = pd.DataFrame(tem)

85

：将df1，df2，df3按照行合并为新DataFrame

:star::star:

Python解法

df = pd.concat([df1,df2,df3],axis=0,ignore_index=True)

86

：将df1，df2，df3按照列合并为新DataFrame

:star::star:

0 1 20 95 0 0.0224921 22 5 -1.2094942 3 10 0.8761273 21 15 -0.1621494 51 20 -0.8154245 30 25 -0.303792...............

Python解法

df = pd.concat([df1,df2,df3],axis=1,ignore_index=True)

87

：查看df所有数据的最小值、25%分位数、中位数、75%分位数、最大值

:star::star:

Python解法

np.percentile(df, q=[0, 25, 50, 75, 100])

88

：修改列名为col1,col2,col3

:star:

Python解法

df.columns = ['col1','col2','col3']

89

：提取第一列中不在第二列出现的数字

:star::star::star:

Python解法

df['col1'][~df['col1'].isin(df['col2'])]

90

：提取第一列和第二列出现频率最高的三个数字

:star::star::star:

Python解法

temp = df['col1'].append(df['col2'])temp.value_counts()[:3]

91

：提取第一列中可以整除5的数字位置

:star::star::star:

Python解法

np.argwhere(df['col1'] % 5==0)

92

：计算第一列数字前一个与后一个的差值

:star::star:

Python解法

df['col1'].diff().tolist()

93

：将col1,col2,clo3三列顺序颠倒

:star::star:

Python解法

df.iloc[:, ::-1]

94

：提取第一列位置在1,10,15的数字

:star::star:

Python解法

df['col1'].take([1,10,15])# 等价于df.iloc[[1,10,15],0]

95

：查找第一列的局部最大值位置

:star::star::star::star:

Python解法

res = np.diff(np.sign(np.diff(df['col1'])))np.where(res== -2)[0] + 1# array([ 2, 4, 7, 9, 12, 15], dtype=int64)

96

：按行计算df的每一行均值

:star::star:

Python解法

df[['col1','col2','col3']].mean(axis=1)

97

：对第二列计算移动平均值

:star::star::star:

Python解法

np.convolve(df['col2'], np.ones(3)/3, mode='valid')

98

：将数据按照第三列值的大小升序排列

:star::star:

Python解法

df.sort_values("col3",inplace=True)

99

：将第一列大于50的数字修改为’高’

:star::star:

Python解法

df.col1[df['col1'] > 50] = '高'

100

：计算第一列与第二列之间的欧式距离

:star::star::star:

Python解法

np.linalg.norm(df['col1']-df['col2'])# 194.29873905921264

101

：从CSV文件中读取指定数据

:star::star:

Python解法

df1 = pd.read_csv(r'C:\Users\chenx\Documents\Data Analysis\数据1.csv',encoding='gbk', usecols=['positionName', 'salary'],nrows = 10)

102

：从CSV文件中读取指定数据

:star::star:

Python解法

df2 = pd.read_csv(r'C:\Users\chenx\Documents\Data Analysis\数据2.csv',                  converters={'薪资水平': lambda x: '高' if float(x) > 10000 else '低'} )

103

：从dataframe提取数据

:star::star::star:

#### 期望结果

Python解法

df2.iloc[::20, :][['薪资水平']]

104

：将数据取消使用科学计数法

:star::star:

df = pd.DataFrame(np.random.random(10)**10, columns=['data'])

#### Python解法

df = pd.DataFrame(np.random.random(10)**10, columns=['data'])df.round(3)

105

：将上一题的数据转换为百分数

:star::star::star:

Python解法

df.style.format({'data': '{0:.2%}'.format})

106

：查找上一题数据中第3大值的行号

:star::star::star:

Python解法

df['data'].argsort()[len(df)-3]

107

：反转df的行

:star::star:

Python解法

df.iloc[::-1, :]

108

：按照多列对数据进行合并

:star::star:

df1= pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],'key2': ['K0', 'K1', 'K0', 'K1'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})df2= pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})

Python解法

pd.merge(df1, df2, on=['key1', 'key2'])

109

：按照多列对数据进行合并

:star::star:

#### 备注

Python解法

pd.merge(df1, df2, how='left', on=['key1', 'key2'])

R语言解法

left_join(df1,df2,by = c('key1','key2'))

110

：再次读取数据1并显示所有的列

:star::star:

Python解法

df = pd.read_csv(r'C:\Users\chenx\Documents\Data Analysis\数据1.csv',encoding='gbk')pd.set_option("display.max.columns", None)

111

：查找secondType与thirdType值相等的行号

:star::star:

Python解法

np.where(df.secondType == df.thirdType)

112

：查找薪资大于平均薪资的第三个数据

:star::star::star:

Python解法

np.argwhere(df['salary'] > df['salary'].mean())[2]# array([5], dtype=int64)

113

：将上一题数据的salary列开根号

:star::star:

Python解法

df[['salary']].apply(np.sqrt)

114

：将上一题数据的linestaion列按_拆分

:star::star:

Python解法

df['split'] = df['linestaion'].str.split('_')

115

：查看上一题数据中一共有多少列

:star:

Python解法

df.shape[1]# 54

116

：提取industryField列以’数据’开头的行

:star::star:

Python解法

df[df['industryField'].str.startswith('数据')]

117

:star::star::star:

Python解法

pd.pivot_table(df,values=["salary","score"],index="positionId")

118

：同时对salary、score两列进行计算

:star::star::star:

Python解法

df[["salary","score"]].agg([np.sum,np.mean,np.min])

119

：对不同列执行不同的计算

:star::star::star:

Python解法

df.agg({"salary":np.sum,"score":np.mean})

120

：计算并提取平均薪资最高的区

:star::star::star::star:

Python解法

df[['district','salary']].groupby(by='district').mean().sort_values('salary',ascending=False).head(1)