玩轉數據處理120題

本文為玩轉數據處理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>

難度:⭐

期望結果

玩轉數據處理120題|Pandas版本

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>


玩轉數據處理120題|Pandas版本

第二期:數據處理基礎


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行

難度:⭐

期望輸出

玩轉數據處理120題|Pandas版本

Python解法

<code>df.head()/<code> 


23

數據計算


題目:將salary列數據轉換為最大值與最小值的平均值

難度:⭐⭐⭐⭐

期望輸出

玩轉數據處理120題|Pandas版本

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列時間轉換為月-日

難度:⭐⭐⭐

期望輸出

玩轉數據處理120題|Pandas版本

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將數據分為三組

難度:⭐⭐⭐⭐

輸入

期望輸出

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製薪資水平頻率分佈直方圖

難度:⭐⭐⭐

期望輸出

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製薪資水平密度曲線

難度:⭐⭐⭐

期望輸出

玩轉數據處理120題|Pandas版本

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行

難度:⭐⭐⭐⭐

期望輸出

玩轉數據處理120題|Pandas版本

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

數據查看


題目:查看數據前三行

難度:⭐

期望結果

玩轉數據處理120題|Pandas版本

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

缺失值處理


題目:提取日期列含有空值的行

難度:⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製收盤價的折線圖

難度:⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

Python解法

<code># Jupyter運行matplotlib
%matplotlib inline

df['收盤價(元)'].plot()
# 等價於
import matplotlib.pyplot as plt
plt.plot(df['收盤價(元)'])/<code>


58

數據可視化


題目:同時繪製開盤價與收盤價

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本


Python解法

<code>plt.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文亂碼
plt.rcParams['axes.unicode_minus'] = False # 解決符號問題

df[['收盤價(元)','開盤價(元)']].plot()/<code>


59

數據可視化


題目:繪製漲跌幅的直方圖

難度:⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

Python解法

<code>plt.hist(df['漲跌幅(%)'])
# 等價於
df['漲跌幅(%)'].hist()/<code>


60

數據可視化


題目:讓直方圖更細緻

難度:⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

Python解法

<code>df['漲跌幅(%)'].hist(bins = 30)/<code>


61

數據創建


題目:以data的列名創建一個dataframe

難度:⭐⭐

Python解法

<code>temp = pd.DataFrame(columns = df.columns.to_list())/<code>


62

異常值處理


題目:打印所有換手率不是數字的行

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製換手率的密度曲線

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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日均線與原始數據繪製在同一個圖上

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製重採樣數據與原始數據

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:繪製上一題的移動均值與原始數據折線圖

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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

數據可視化


題目:計算布林線並繪製

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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行進行一次抽樣

期望結果

玩轉數據處理120題|Pandas版本

Python解法

<code>df2.iloc[::20, :][['薪資水平']]/<code>


104

數據處理


題目:將數據取消使用科學計數法

難度:⭐⭐

輸入

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

期望結果

玩轉數據處理120題|Pandas版本

Python解法

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


105

數據處理


題目:將上一題的數據轉換為百分數

難度:⭐⭐⭐

期望結果

玩轉數據處理120題|Pandas版本

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>


玩轉數據處理120題|Pandas版本

以上就是Pandas進階修煉120題全部內容,如果能堅持走到這裡的讀者,我想你已經掌握了處理數據的常用操作,並且在之後的數據分析中碰到相關問題,希望武裝了Pandas的你能夠從容的解決!

另外我已將習題與源碼整理成電子版,後臺回覆pandas即可下載,我們下個專題見,拜拜~


玩轉數據處理120題|Pandas版本



分享到:


相關文章: