本文為玩轉數據處理120題|Pandas版本
作者|劉早起
Pandas進階修煉120題系列一共涵蓋了數據處理、計算、可視化等常用操作,希望通過120道精心挑選的習題吃透pandas。並且針對部分習題給出了多種解法與註解,動手敲一遍代碼一定會讓你有所收穫!
1
創建DataFrame
題目:將下面的字典創建為DataFrame
<code>data = {"grammer":["Python","C","Java","GO",np.nan,"SQL","PHP","Python"],
"score":[1,2,np.nan,4,5,6,7,10]}/<code>
難度:⭐
期望結果
Python解法
<code>import numpy as np
import pandas as pd
df = 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]})/<code>
注:1-20題均基於該數據框給出
2
數據提取
題目:提取含有字符串"Python"的行
難度:⭐⭐
期望結果
<code>grammer score
0 Python 1.0
7 Python 10.0/<code>
Python解法:
<code>#> 1
df[df['grammer'] == 'Python']
#> 2
results = df['grammer'].str.contains("Python")
results.fillna(value=False,inplace = True)
df[results]/<code>
3
提取列名
題目:輸出df的所有列名
難度:⭐
期望結果
<code>Index(['grammer', 'score'], dtype='object')/<code>
Python解法
<code>df.columns/<code>
4
修改列名
題目:修改第二列列名為'popularity'
難度:⭐⭐
Python解法
<code>df.rename(columns={'score':'popularity'}, inplace = True)/<code>
5
字符統計
題目:統計grammer列中每種編程語言出現的次數
難度:⭐⭐
Python解法
<code>df['grammer'].value_counts()/<code>
6
缺失值處理
題目:將空值用上下值的平均值填充
難度:⭐⭐⭐
Python解法
<code># pandas裡有一個插值方法,就是計算缺失值上下兩數的均值
df['popularity'] = df['popularity'].fillna(df['popularity'].interpolate())/<code>
7
數據提取
題目:提取popularity列中值大於3的行
難度:⭐⭐
Python解法
<code>df[df['popularity'] > 3]/<code>
8
數據去重
題目:按照grammer列進行去重
難度:⭐⭐
Python解法
<code>df.drop_duplicates(['grammer'])/<code>
9
數據計算
題目 :計算popularity列平均值
難度:⭐⭐
Python解法
<code>df['popularity'].mean()
# 4.75/<code>
10
格式轉換
題目:將grammer列轉換為list
難度:⭐⭐
Python解法
<code>df['grammer'].to_list()
# ['Python', 'C', 'Java', 'GO', nan, 'SQL', 'PHP', 'Python']/<code>
11
數據保存
題目:將DataFrame保存為EXCEL
難度:⭐⭐
Python解法
<code>df.to_excel('filename.xlsx')/<code>
12
數據查看
題目:查看數據行列數
難度:⭐
Python解法
<code>df.shape
# (8, 2)/<code>
13
數據提取
題目:提取popularity列值大於3小於7的行
難度:⭐⭐
Python解法
<code>df[(df['popularity'] > 3) & (df['popularity'] /<code>
14
位置處理
題目:交換兩列位置
難度:⭐⭐⭐
Python解法
<code>temp = df['popularity']
df.drop(labels=['popularity'], axis=1,inplace = True)
df.insert(0, 'popularity', temp)/<code>
15
數據提取
題目:提取popularity列最大值所在行
難度:⭐⭐
Python解法
<code>df[df['popularity'] == df['popularity'].max()]/<code>
16
數據查看
題目:查看最後5行數據
難度:⭐
Python解法
<code>df.tail()/<code>
17
數據修改
題目:刪除最後一行數據
難度:⭐
Python解法
<code>df = df.drop(labels=df.shape[0]-1)/<code>
18
數據修改
題目 :添加一行數據['Perl',6.6]
難度:⭐⭐
Python解法
<code>row = {'grammer':'Perl','popularity':6.6}
df = df.append(row,ignore_index=True)/<code>
19
數據整理
題目:對數據按照"popularity"列值的大小進行排序
難度:⭐⭐
Python解法
<code>df.sort_values("popularity",inplace=True)/<code>
20
字符統計
題目:統計grammer列每個字符串的長度
難度:⭐⭐⭐
Python解法
<code>df['grammer'] = df['grammer'].fillna('R')
df['len_str'] = df['grammer'].map(lambda x: len(x))/<code>
第二期:數據處理基礎
21
數據讀取
題目:讀取本地EXCEL數據
難度:⭐
Python解法
<code>import pandas as pd
import numpy as np
df = pd.read_excel(r'C:\\Users\\chenx\\Documents\\Data Analysis\\pandas120.xlsx')/<code>
21—50部分習題與該數據相關
22
數據查看
題目:查看df數據前5行
難度:⭐
期望輸出
Python解法
<code>df.head()/<code>
23
數據計算
題目:將salary列數據轉換為最大值與最小值的平均值
難度:⭐⭐⭐⭐
期望輸出
Python解法
<code># 方法一: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 df
df = df.apply(func,axis=1)
# 方法二:iterrows + 正則
import re
for index,row in df.iterrows():
nums = re.findall('\\d+',row[2])
df.iloc[index,2] = int(eval(f'({nums[0]} + {nums[1]}) / 2 * 1000'))/<code>
24
數據分組
題目:將數據根據學歷進行分組並計算平均薪資
難度:⭐⭐⭐
期望輸出
<code>education salary
不限 19600.000000
大專 10000.000000
本科 19361.344538
碩士 20642.857143/<code>
Python解法
<code>df.groupby('education').mean()/<code>
25
時間轉換
題目:將createTime列時間轉換為月-日
難度:⭐⭐⭐
期望輸出
Python解法
<code>for index,row in df.iterrows():
df.iloc[index,0] = df.iloc[index,0].to_pydatetime().strftime("%m-%d")/<code>
26
數據查看
題目:查看索引、數據類型和內存信息
難度:⭐
期望輸出
<code><class>
RangeIndex: 135 entries, 0 to 134
Data columns (total 4 columns):
createTime 135 non-null object
education 135 non-null object
salary 135 non-null int64
categories 135 non-null category
dtypes: category(1), int64(1), object(2)
memory usage: 3.5+ KB/<class>/<code>
Python解法
<code>df.info()/<code>
27
數據查看
題目:查看數值型列的彙總統計
難度:⭐
Python解法
<code>df.describe()/<code>
R解法
<code>summary(df)/<code>
28
數據整理
題目 :新增一列根據salary將數據分為三組
難度:⭐⭐⭐⭐
輸入
期望輸出
Python解法
<code>bins = [0,5000, 20000, 50000]
group_names = ['低', '中', '高']
df['categories'] = pd.cut(df['salary'], bins, labels=group_names)/<code>
29
數據整理
題目:按照salary列對數據降序排列
難度:⭐⭐
Python解法
<code>df.sort_values('salary', ascending=False)/<code>
30
數據提取
題目:取出第33行數據
難度:⭐⭐
Python解法
<code>df.iloc[32]/<code>
31
數據計算
題目:計算salary列的中位數
難度:⭐⭐
Python解法
<code>np.median(df['salary'])
# 17500.0/<code>
32
數據可視化
題目:繪製薪資水平頻率分佈直方圖
難度:⭐⭐⭐
期望輸出
Python解法
<code># Jupyter運行matplotlib成像需要運行魔術命令
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文亂碼
plt.rcParams['axes.unicode_minus'] = False # 解決符號問題
import matplotlib.pyplot as plt
plt.hist(df.salary)
# 也可以用原生pandas方法繪圖
df.salary.plot(kind='hist')/<code>
33
數據可視化
題目:繪製薪資水平密度曲線
難度:⭐⭐⭐
期望輸出
Python解法
<code>df.salary.plot(kind='kde',xlim = (0,70000))/<code>
34
數據刪除
題目:刪除最後一列categories
難度:⭐
Python解法
<code>del df['categories']
# 等價於
df.drop(columns=['categories'], inplace=True)/<code>
35
數據處理
題目:將df的第一列與第二列合併為新的一列
難度:⭐⭐
Python解法
<code>df['test'] = df['education'] + df['createTime']/<code>
36
數據處理
題目:將education列與salary列合併為新的一列
難度:⭐⭐⭐
備註:salary為int類型,操作與35題有所不同
Python解法
<code>df["test1"] = df["salary"].map(str) + df['education']/<code>
37
數據計算
題目:計算salary最大值與最小值之差
難度:⭐⭐⭐
Python解法
<code>df[['salary']].apply(lambda x: x.max() - x.min())
# salary 41500
# dtype: int64/<code>
38
數據處理
題目:將第一行與最後一行拼接
難度 :⭐⭐
Python解法
<code>pd.concat([df[1:2], df[-1:]])/<code>
39
數據處理
題目:將第8行數據添加至末尾
難度:⭐⭐
Python解法
<code>df.append(df.iloc[7])/<code>
40
數據查看
題目 :查看每列的數據類型
難度:⭐
期望結果
<code>createTime object
education object
salary int64
test object
test1 object
dtype: object/<code>
Python解法
<code>df.dtypes
# createTime object
# education object
# salary int64
# test object
# test1 object
# dtype: object/<code>
41
數據處理
題目:將createTime列設置為索引
難度:⭐⭐
Python解法
<code>df.set_index("createTime")/<code>
42
數據創建
題目:生成一個和df長度相同的隨機數dataframe
難度:⭐⭐
Python解法
<code>df1 = pd.DataFrame(pd.Series(np.random.randint(1, 10, 135)))/<code>
43
數據處理
題目:將上一題生成的dataframe與df合併
難度:⭐⭐
Python解法
<code>df= pd.concat([df,df1],axis=1)/<code>
44
數據計算
題目:生成新的一列new為salary列減去之前生成隨機數列
難度:⭐⭐
Python解法
<code>df["new"] = df["salary"] - df[0]/<code>
45
缺失值處理
題目:檢查數據中是否含有任何缺失值
難度:⭐⭐⭐
Python解法
<code>df.isnull().values.any()
# False/<code>
46
數據轉換
題目:將salary列類型轉換為浮點數
難度:⭐⭐⭐
Python解法
<code>df['salary'].astype(np.float64)/<code>
47
數據計算
題目:計算salary大於10000的次數
難度:⭐⭐
Python解法
<code>len(df[df['salary'] > 10000])
# 119/<code>
48
數據統計
題目:查看每種學歷出現的次數
難度:⭐⭐⭐
期望輸出
<code>本科 119
碩士 7
不限 5
大專 4
Name: education, dtype: int64/<code>
Python解法
<code>df.education.value_counts()/<code>
49
數據查看
題目:查看education列共有幾種學歷
難度:⭐⭐
Python解法
<code>df['education'].nunique()
# 4/<code>
50
數據提取
題目:提取salary與new列的和大於60000的最後3行
難度:⭐⭐⭐⭐
期望輸出
Python解法
<code>rowsums = df[['salary','new']].apply(np.sum, axis=1)
res = df.iloc[np.where(rowsums > 60000)[0][-3:], :]/<code>
51
數據讀取
題目:使用絕對路徑讀取本地Excel數據
難度:⭐
Python解法
<code>import pandas as pd
import numpy as np
df = pd.read_excel(r'C:\\Users\\chenx\\Documents\\Data Analysis\\Pandas51-80.xls')/<code>
備註
請將答案中路徑替換為自己機器存儲數據的絕對路徑,51—80相關習題與該數據有關
52
數據查看
題目:查看數據前三行
難度:⭐
期望結果
Python解法
<code>df.head(3)/<code>
53
缺失值處理
題目:查看每列數據缺失值情況
難度:⭐⭐
期望結果
<code>代碼 1
簡稱 2
日期 2
前收盤價(元) 2
開盤價(元) 2
最高價(元) 2
最低價(元) 2
收盤價(元) 2
成交量(股) 2
成交金額(元) 2
................./<code>
Python解法
<code>df.isnull().sum()/<code>
54
缺失值處理
題目:提取日期列含有空值的行
難度:⭐⭐
期望結果
Python解法
<code>df[df['日期'].isnull()]/<code>
55
缺失值處理
題目:輸出每列缺失值具體行數
難度:⭐⭐⭐
期望結果
<code>列名:"代碼", 第[327]行位置有缺失值
列名:"簡稱", 第[327, 328]行位置有缺失值
列名:"日期", 第[327, 328]行位置有缺失值
列名:"前收盤價(元)", 第[327, 328]行位置有缺失值
列名:"開盤價(元)", 第[327, 328]行位置有缺失值
列名:"最高價(元)", 第[327, 328]行位置有缺失值
列名:"最低價(元)", 第[327, 328]行位置有缺失值
列名:"收盤價(元)", 第[327, 328]行位置有缺失值
................/<code>
Python解法
<code>for i in df.columns:
if df[i].count() != len(df):
row = df[i][df[i].isnull().values].index.tolist()
print('列名:"{}", 第{}行位置有缺失值'.format(i,row))/<code>
56
缺失值處理
題目:刪除所有存在缺失值的行
難度:⭐⭐
Python解法
<code>df.dropna(axis=0, how='any', inplace=True)/<code>
備註
<code>axis:0-行操作(默認),1-列操作
how:any-只要有空值就刪除(默認),all-全部為空值才刪除
inplace:False-返回新的數據集(默認),True-在原數據集上操作/<code>
57
數據可視化
題目:繪製收盤價的折線圖
難度:⭐⭐
期望結果
Python解法
<code># Jupyter運行matplotlib
%matplotlib inline
df['收盤價(元)'].plot()
# 等價於
import matplotlib.pyplot as plt
plt.plot(df['收盤價(元)'])/<code>
58
數據可視化
題目:同時繪製開盤價與收盤價
難度:⭐⭐⭐
期望結果
Python解法
<code>plt.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文亂碼
plt.rcParams['axes.unicode_minus'] = False # 解決符號問題
df[['收盤價(元)','開盤價(元)']].plot()/<code>
59
數據可視化
題目:繪製漲跌幅的直方圖
難度:⭐⭐
期望結果
Python解法
<code>plt.hist(df['漲跌幅(%)'])
# 等價於
df['漲跌幅(%)'].hist()/<code>
60
數據可視化
題目:讓直方圖更細緻
難度:⭐⭐
期望結果
Python解法
<code>df['漲跌幅(%)'].hist(bins = 30)/<code>
61
數據創建
題目:以data的列名創建一個dataframe
難度:⭐⭐
Python解法
<code>temp = pd.DataFrame(columns = df.columns.to_list())/<code>
62
異常值處理
題目:打印所有換手率不是數字的行
難度:⭐⭐⭐
期望結果
Python解法
<code>for index,row in df.iterrows():
if type(row[13]) != float:
temp = temp.append(df.loc[index])/<code>
63
異常值處理
題目:打印所有換手率為--的行
難度:⭐⭐⭐
Python解法
<code>df[df['換手率(%)'] == '--']/<code>
備註
通過上一題我們發現換手率的異常值只有--
64
數據處理
題目:重置data的行號
難度:⭐
Python解法
<code>df = df.reset_index(drop=True)/<code>
備註
有時我們修改數據會導致索引混亂
65
異常值處理
題目:刪除所有換手率為非數字的行
難度:⭐⭐⭐
Python解法
<code>lst = []
for index,row in df.iterrows():
if type(row[13]) != float:
lst.append(index)
df.drop(labels=lst,inplace=True)/<code>
66
數據可視化
題目:繪製換手率的密度曲線
難度:⭐⭐⭐
期望結果
Python解法
<code>df['換手率(%)'].plot(kind='kde',xlim=(0,0.6))/<code>
67
數據計算
題目:計算前一天與後一天收盤價的差值
難度:⭐⭐
Python解法
<code>df['收盤價(元)'].diff()/<code>
68
數據計算
題目:計算前一天與後一天收盤價變化率
難度:⭐⭐
Python解法
<code>data['收盤價(元)'].pct_change()/<code>
69
數據處理
題目:設置日期為索引
難度:⭐
Python解法
<code>df.set_index('日期')/<code>
70
指標計算
題目:以5個數據作為一個數據滑動窗口,在這個5個數據上取均值(收盤價)
難度:⭐⭐⭐
Python解法
<code>df['收盤價(元)'].rolling(5).mean()/<code>
71
指標計算
題目:以5個數據作為一個數據滑動窗口,計算這五個數據總和(收盤價)
難度:⭐⭐⭐
Python解法
<code>df['收盤價(元)'].rolling(5).sum()/<code>
72
數據可視化
題目:將收盤價5日均線、20日均線與原始數據繪製在同一個圖上
難度:⭐⭐⭐
期望結果
Python解法
<code>df['收盤價(元)'].plot()
df['收盤價(元)'].rolling(5).mean().plot()
df['收盤價(元)'].rolling(20).mean().plot()/<code>
73
數據重採樣
題目:按周為採樣規則,取一週收盤價最大值
難度:⭐⭐⭐
Python解法
<code>df = df.set_index('日期')
df['收盤價(元)'].resample('W').max()/<code>
74
數據可視化
題目:繪製重採樣數據與原始數據
難度:⭐⭐⭐
期望結果
Python解法
<code>df['收盤價(元)'].plot()
df['收盤價(元)'].resample('7D').max().plot()/<code>
75
數據處理
題目:將數據往後移動5天
難度:⭐⭐
Python解法
<code>df.shift(5)/<code>
76
數據處理
題目:將數據向前移動5天
難度 :⭐⭐
Python解法
<code>df.shift(-5)/<code>
77
數據計算
題目:使用expending函數計算開盤價的移動窗口均值
難度:⭐⭐
Python解法
<code>df['開盤價(元)'].expanding(min_periods=1).mean()/<code>
78
數據可視化
題目:繪製上一題的移動均值與原始數據折線圖
難度:⭐⭐⭐
期望結果
Python解法
<code>df['expanding Open mean']=df['開盤價(元)'].expanding(min_periods=1).mean()
df[['開盤價(元)', 'expanding Open mean']].plot(figsize=(16, 6))/<code>
79
數據計算
題目:計算布林指標
難度:⭐⭐⭐⭐
Python解法
<code>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()/<code>
80
數據可視化
題目:計算布林線並繪製
難度:⭐⭐⭐
期望結果
Python解法
<code>df[['收盤價(元)', 'former 30 days rolling Close mean','upper bound','lower bound' ]].plot(figsize=(16, 6))/<code>
81
數據查看
題目:導入並查看pandas與numpy版本
難度:⭐
Python解法
<code>import pandas as pd
import numpy as np
print(np.__version__)
# 1.16.5
print(pd.__version__)
# 0.25.1/<code>
82
數據創建
題目:從NumPy數組創建DataFrame
難度:⭐
備註
使用numpy生成20個0-100隨機數
Python解法
<code>tem = np.random.randint(1,100,20)
df1 = pd.DataFrame(tem)/<code>
83
數據創建
題目:從NumPy數組創建DataFrame
難度:⭐
備註
使用numpy生成20個0-100固定步長的數
Python解法
<code>tem = np.arange(0,100,5)
df2 = pd.DataFrame(tem)/<code>
84
數據創建
題目:從NumPy數組創建DataFrame
難度:⭐
備註
使用numpy生成20個指定分佈(如標準正態分佈)的數
Python解法
<code>tem = np.random.normal(0, 1, 20)
df3 = pd.DataFrame(tem)/<code>
85
數據創建
題目:將df1,df2,df3按照行合併為新DataFrame
難度:⭐⭐
Python解法
<code>df = pd.concat([df1,df2,df3],axis=0,ignore_index=True)/<code>
86
數據創建
題目:將df1,df2,df3按照列合併為新DataFrame
難度:⭐⭐
期望結果
<code>0 1 2
0 95 0 0.022492
1 22 5 -1.209494
2 3 10 0.876127
3 21 15 -0.162149
4 51 20 -0.815424
5 30 25 -0.303792
.............../<code>
Python解法
<code>df = pd.concat([df1,df2,df3],axis=1,ignore_index=True)/<code>
87
數據查看
題目:查看df所有數據的最小值、25%分位數、中位數、75%分位數、最大值
難度:⭐⭐
Python解法
<code>np.percentile(df, q=[0, 25, 50, 75, 100])/<code>
88
數據修改
題目:修改列名為col1,col2,col3
難度:⭐
Python解法
<code>df.columns = ['col1','col2','col3']/<code>
89
數據提取
題目:提取第一列中不在第二列出現的數字
難度:⭐⭐⭐
Python解法
<code>df['col1'][~df['col1'].isin(df['col2'])]/<code>
90
數據提取
題目:提取第一列和第二列出現頻率最高的三個數字
難度:⭐⭐⭐
Python解法
<code>temp = df['col1'].append(df['col2'])
temp.value_counts()[:3]/<code>
91
數據提取
題目:提取第一列中可以整除5的數字位置
難度:⭐⭐⭐
Python解法
<code>np.argwhere(df['col1'] % 5==0)/<code>
92
數據計算
題目:計算第一列數字前一個與後一個的差值
難度:⭐⭐
Python解法
<code>df['col1'].diff().tolist()/<code>
93
數據處理
題目:將col1,col2,clo3三列順序顛倒
難度:⭐⭐
Python解法
<code>df.iloc[:, ::-1]/<code>
94
數據提取
題目:提取第一列位置在1,10,15的數字
難度:⭐⭐
Python解法
<code>df['col1'].take([1,10,15])
# 等價於
df.iloc[[1,10,15],0]/<code>
95
數據查找
題目:查找第一列的局部最大值位置
難度:⭐⭐⭐⭐
備註
即比它前一個與後一個數字的都大的數字
Python解法
<code>res = np.diff(np.sign(np.diff(df['col1'])))
np.where(res== -2)[0] + 1
# array([ 2, 4, 7, 9, 12, 15], dtype=int64)/<code>
96
數據計算
題目:按行計算df的每一行均值
難度 :⭐⭐
Python解法
<code>df[['col1','col2','col3']].mean(axis=1)/<code>
97
數據計算
題目:對第二列計算移動平均值
難度:⭐⭐⭐
備註
每次移動三個位置,不可以使用自定義函數
Python解法
<code>np.convolve(df['col2'], np.ones(3)/3, mode='valid')/<code>
98
數據修改
題目:將數據按照第三列值的大小升序排列
難度:⭐⭐
Python解法
<code>df.sort_values("col3",inplace=True)/<code>
99
數據修改
題目:將第一列大於50的數字修改為'高'
難度:⭐⭐
Python解法
<code>df.col1[df['col1'] > 50] = '高'/<code>
100
數據計算
題目:計算第一列與第二列之間的歐式距離
難度:⭐⭐⭐
備註
不可以使用自定義函數
Python解法
<code>np.linalg.norm(df['col1']-df['col2'])
# 194.29873905921264/<code>
101
數據讀取
題目:從CSV文件中讀取指定數據
難度:⭐⭐
備註
從數據1中的前10行中讀取positionName, salary兩列
Python解法
<code>df1 = pd.read_csv(r'C:\\Users\\chenx\\Documents\\Data Analysis\\數據1.csv',encoding='gbk', usecols=['positionName', 'salary'],nrows = 10)/<code>
102
數據讀取
題目:從CSV文件中讀取指定數據
難度:⭐⭐
備註
從數據2中讀取數據並在讀取數據時將薪資大於10000的為改為高
Python解法
<code>df2 = pd.read_csv(r'C:\\Users\\chenx\\Documents\\Data Analysis\\數據2.csv',
converters={'薪資水平': lambda x: '高' if float(x) > 10000 else '低'} )/<code>
103
數據計算
題目:從dataframe提取數據
難度:⭐⭐⭐
備註
從上一題數據中,對薪資水平列每隔20行進行一次抽樣
期望結果
Python解法
<code>df2.iloc[::20, :][['薪資水平']]/<code>
104
數據處理
題目:將數據取消使用科學計數法
難度:⭐⭐
輸入
<code>df = pd.DataFrame(np.random.random(10)**10, columns=['data'])/<code>
期望結果
Python解法
<code>df = pd.DataFrame(np.random.random(10)**10, columns=['data'])
df.round(3)/<code>
105
數據處理
題目:將上一題的數據轉換為百分數
難度:⭐⭐⭐
期望結果
Python解法
<code>df.style.format({'data': '{0:.2%}'.format})/<code>
106
數據查找
題目:查找上一題數據中第3大值的行號
難度:⭐⭐⭐
Python解法
<code>df['data'].argsort()[len(df)-3]/<code>
107
數據處理
題目:反轉df的行
難度:⭐⭐
Python解法
<code>df.iloc[::-1, :]/<code>
108
數據重塑
題目:按照多列對數據進行合併
難度:⭐⭐
輸入
<code>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']})/<code>
Python解法
<code>pd.merge(df1, df2, on=['key1', 'key2'])/<code>
109
數據重塑
題目:按照多列對數據進行合併
難度:⭐⭐
備註
只保存df1的數據
Python解法
<code>pd.merge(df1, df2, how='left', on=['key1', 'key2'])/<code>
R語言解法
<code>left_join(df1,df2,by = c('key1','key2'))/<code>
110
數據處理
題目:再次讀取數據1並顯示所有的列
難度:⭐⭐
備註
數據中由於列數較多中間列不顯示
Python解法
<code>df = pd.read_csv(r'C:\\Users\\chenx\\Documents\\Data Analysis\\數據1.csv',encoding='gbk')
pd.set_option("display.max.columns", None)/<code>
111
數據查找
題目:查找secondType與thirdType值相等的行號
難度:⭐⭐
Python解法
<code>np.where(df.secondType == df.thirdType)/<code>
112
數據查找
題目:查找薪資大於平均薪資的第三個數據
難度:⭐⭐⭐
Python解法
<code>np.argwhere(df['salary'] > df['salary'].mean())[2]
# array([5], dtype=int64)/<code>
113
數據計算
題目:將上一題數據的salary列開根號
難度:⭐⭐
Python解法
<code>df[['salary']].apply(np.sqrt)/<code>
114
數據處理
題目:將上一題數據的linestaion列按_拆分
難度:⭐⭐
Python解法
<code>df['split'] = df['linestaion'].str.split('_')/<code>
115
數據查看
題目:查看上一題數據中一共有多少列
難度:⭐
Python解法
<code>df.shape[1]
# 54/<code>
116
數據提取
題目:提取industryField列以'數據'開頭的行
難度:⭐⭐
Python解法
<code>df[df['industryField'].str.startswith('數據')]/<code>
117
數據計算
題目:以salary score 和 positionID製作數據透視
難度:⭐⭐⭐
Python解法
<code>pd.pivot_table(df,values=["salary","score"],index="positionId")/<code>
118
數據計算
題目:同時對salary、score兩列進行計算
難度:⭐⭐⭐
Python解法
<code>df[["salary","score"]].agg([np.sum,np.mean,np.min])/<code>
119
數據計算
題目:對不同列執行不同的計算
難度:⭐⭐⭐
備註
對salary求平均,對score列求和
Python解法
<code>df.agg({"salary":np.sum,"score":np.mean})/<code>
120
數據計算
題目:計算並提取平均薪資最高的區
難度:⭐⭐⭐⭐
Python解法
<code>df[['district','salary']].groupby(by='district').mean().sort_values(
'salary',ascending=False).head(1)/<code>
以上就是Pandas進階修煉120題全部內容,如果能堅持走到這裡的讀者,我想你已經掌握了處理數據的常用操作,並且在之後的數據分析中碰到相關問題,希望武裝了Pandas的你能夠從容的解決!
另外我已將習題與源碼整理成電子版,後臺回覆pandas即可下載,我們下個專題見,拜拜~
閱讀更多 二手程序員 的文章