文章目录
- Pandas进阶修炼120题
-
- 第一期 Pandas基础
-
- 1.将下面的字典创建为DataFrame
- 2.提取含有字符串"Python"的行
- 3.输出df的所有列名
- 4.修改第二列列名为'popularity'
- 5.统计grammer列中每种编程语言出现的次数
- 6.将空值用上下值的平均值填充
-
- 通常方法(直接写逻辑,并分别使用df.at,df.loc,df.iloc 完成赋值操作)
- 简便方法(interpolate())
- 拓展:df.at,df.loc,df.iloc 介绍与使用区别
- 7.提取popularity列中值大于3的行
- 8.按照grammer列进行去除重复值
- 9.计算popularity列平均值
- 10.将grammer列转换为list
- 11.将DataFrame保存为Excel
- 12.查看数据行列数
- 13.提取popularity列值大于3小于7的行
- 14.交换两列位置
-
- 方法一:使用temp做中转
- 方法二:直接根据columns名称生成新的df
- 15.提取popularity列最大值所在行
- 16.查看最后5行数据
- 17.删除最后一行数据
- 18.添加一行数据['Perl',6.6]
- 19.对数据按照"popularity"列值的大小进行排序
- 20.统计grammer列每个字符串的长度
自己再写一遍的pandas习题,相比于标准答案添加了自己的理解与注释,也可直接下载链接上的习题
链接:https://pan.baidu.com/s/1arrqcBFZKqJngzRzUB2QfA?pwd=29eb
提取码:29eb
–来自百度网盘超级会员V3的分享
Pandas进阶修炼120题
第一期 Pandas基础
import numpy as np
import pandas as pd
1.将下面的字典创建为DataFrame
data = {
"grammer": ["Python", "C", "Java", "GO", np.nan, "SQL", "PHP", "Python"],
"score": [1, 2, np.nan, 4, 5, 6, 7, 10]
}
df = pd.DataFrame(data = data)
df
|
grammer |
score |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
NaN |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
2.提取含有字符串"Python"的行
df[df['grammer'] == 'Python']
|
grammer |
score |
0 |
Python |
1.0 |
7 |
Python |
10.0 |
results = df['grammer'].str.contains("Python")
results.fillna(value=False, inplace=True)
df[results]
|
grammer |
score |
0 |
Python |
1.0 |
7 |
Python |
10.0 |
3.输出df的所有列名
df.columns
Index(['grammer', 'score'], dtype='object')
4.修改第二列列名为’popularity’
df.rename(columns = {'score':'popularity'},inplace = True)
df
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
NaN |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
5.统计grammer列中每种编程语言出现的次数
df.grammer.value_counts()
Python 2
C 1
Java 1
GO 1
SQL 1
PHP 1
Name: grammer, dtype: int64
6.将空值用上下值的平均值填充
通常方法(直接写逻辑,并分别使用df.at,df.loc,df.iloc 完成赋值操作)
这是语言模型输出的结果,但是仍有值得学习的地方。
限制:
首先需要限定范围,要填充的值不能是第一个和最后一个,也可单独写规则,此处不再赘述
此代码只考虑了空值的上下值都为非空的情况
df1 = df[:].copy()
null_values = df1['popularity'].isnull()
for i in range(1, len(df1) - 1):
if null_values[i]:
avg = (df1.at[i-1, 'popularity'] + df1.at[i+1, 'popularity']) / 2
df1.at[i, 'popularity'] = avg
print(df1)
grammer popularity
0 Python 1.0
1 C 2.0
2 Java 3.0
3 GO 4.0
4 NaN 5.0
5 SQL 6.0
6 PHP 7.0
7 Python 10.0
df1 = df[:].copy()
null_values = df1['popularity'].isnull()
for i in range(1, len(df1) - 1):
if null_values[i]:
avg = (df1.loc[i-1, 'popularity'] + df1.loc[i+1, 'popularity']) / 2
df1.loc[i, 'popularity'] = avg
print(df1)
grammer popularity
0 Python 1.0
1 C 2.0
2 Java 3.0
3 GO 4.0
4 NaN 5.0
5 SQL 6.0
6 PHP 7.0
7 Python 10.0
df1 = df[:].copy()
null_values = df1['popularity'].isnull()
for i in range(1, len(df1) - 1):
if null_values[i]:
avg = (df1.iloc[i-1, 1] + df1.iloc[i+1, 1]) / 2
df1.iloc[i, 1] = avg
print(df1)
grammer popularity
0 Python 1.0
1 C 2.0
2 Java 3.0
3 GO 4.0
4 NaN 5.0
5 SQL 6.0
6 PHP 7.0
7 Python 10.0
简便方法(interpolate())
df.interpolate() 是Pandas库中的一个方法,用于对DataFrame中的缺失值进行插值处理。这个方法会根据已有的数据点在缺失值周围的数据点上进行线性插值或多项式插值(如果提供的话),以填补缺失值。
注意:需要注意的是填充可能不是均值
df['popularity'] = df['popularity'].fillna(df['popularity'].interpolate())
df
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
拓展:df.at,df.loc,df.iloc 介绍与使用区别
df.at: df.at 主要用于在 DataFrame 中以整数位置的方式访问数据。它接受一个整数索引作为参数,并返回该索引处的单个值。
请注意,使用 df.at 可能会导致越界访问,因为它不检查索引是否超出了数据集的范围。
此外.ix索引器在最近的pandas版本中已被弃用,不再推荐使用。
示例:
t_data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
t_df = pd.DataFrame(t_data)
print(t_df.at[0,'A'])
print(t_df.at[2,'B'])
1
6
df.loc: df.loc 是 Pandas DataFrame 中用于基于标签(label)访问数据的函数。它允许您通过行标签和列标签来选择数据。
与 df.at 不同,df.loc 在访问数据时会抛出异常,如果索引超出了数据集的范围。
示例:
t_data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
t_df = pd.DataFrame(t_data)
print(t_df.loc[0,'A'])
print(t_df.loc[2,'B'])
1
6
df.iloc: df.iloc 也是 Pandas DataFrame 中用于基于整数位置访问数据的函数。它允许您通过整数索引来选择数据。
与 df.at 类似,使用 df.iloc 也可能导致越界访问。然而,与 df.loc 不同,df.iloc 在访问数据时不会抛出异常。
示例:
t_data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
t_df = pd.DataFrame(t_data)
print(t_df.iloc[0,0])
print(t_df.iloc[2,1])
1
6
7.提取popularity列中值大于3的行
df[df['popularity']>3]
|
grammer |
popularity |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
8.按照grammer列进行去除重复值
df.drop_duplicates(subset = ['grammer'])
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
9.计算popularity列平均值
df['popularity'].mean()
4.75
10.将grammer列转换为list
df['grammer'].to_list()
['Python', 'C', 'Java', 'GO', nan, 'SQL', 'PHP', 'Python']
需要注意的是:df[‘A’].values 返回的是 numpy 数组,而 df[‘A’].to_list() 返回的是一个 Python 列表。
在处理数值型数据时,使用 numpy 数组可以获得更好的性能和更丰富的数学运算功能。
df['grammer'].values
array(['Python', 'C', 'Java', 'GO', nan, 'SQL', 'PHP', 'Python'],
dtype=object)
11.将DataFrame保存为Excel
df.to_excel('语法及流行度.xlsx',index = False)
12.查看数据行列数
df.shape
(8, 2)
13.提取popularity列值大于3小于7的行
df[(df['popularity']>3) & (df['popularity']<7)]
|
grammer |
popularity |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
14.交换两列位置
'''
方法1
'''
temp = df['popularity']
df.drop(labels=['popularity'], axis=1, inplace=True)
df.insert(0, 'popularity', temp)
df
'''
方法2
cols = df.columns[[1,0]]
df = df[cols]
df
'''
'\n方法2\ncols = df.columns[[1,0]]\ndf = df[cols]\ndf\n'
方法一:使用temp做中转
temp = df['popularity']
df.drop(labels = ['popularity'],axis = 1,inplace = True)
df.insert(0,'popularity',temp)
df
|
popularity |
grammer |
0 |
1.0 |
Python |
1 |
2.0 |
C |
2 |
3.0 |
Java |
3 |
4.0 |
GO |
4 |
5.0 |
NaN |
5 |
6.0 |
SQL |
6 |
7.0 |
PHP |
7 |
10.0 |
Python |
方法二:直接根据columns名称生成新的df
cols = df.columns[[1,0]]
df = df[cols]
df
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
15.提取popularity列最大值所在行
df[df['popularity'] == df['popularity'].max()].index.values[0]
7
16.查看最后5行数据
df.tail()
|
grammer |
popularity |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Python |
10.0 |
17.删除最后一行数据
df.drop(len(df)-1,inplace = True)
df
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_34948\604545817.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df.drop(len(df)-1,inplace = True)
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
18.添加一行数据[‘Perl’,6.6]
row = {'grammer':'Perl','popularity':6.6}
df = df.append(row,ignore_index = True)
df
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_34948\1468148379.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df = df.append(row,ignore_index = True) # 因为没有inplace = True 的选项,需要重新赋值才能生效
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
6 |
PHP |
7.0 |
7 |
Perl |
6.6 |
19.对数据按照"popularity"列值的大小进行排序
df.sort_values(by = ['popularity'],inplace = True)
df
|
grammer |
popularity |
0 |
Python |
1.0 |
1 |
C |
2.0 |
2 |
Java |
3.0 |
3 |
GO |
4.0 |
4 |
NaN |
5.0 |
5 |
SQL |
6.0 |
7 |
Perl |
6.6 |
6 |
PHP |
7.0 |
20.统计grammer列每个字符串的长度
df['grammer'].fillna('R',inplace = True)
df['str_len'] = df['grammer'].apply(lambda x:len(x))
df
|
grammer |
popularity |
str_len |
0 |
Python |
1.0 |
6 |
1 |
C |
2.0 |
1 |
2 |
Java |
3.0 |
4 |
3 |
GO |
4.0 |
2 |
4 |
R |
5.0 |
1 |
5 |
SQL |
6.0 |
3 |
7 |
Perl |
6.6 |
4 |
6 |
PHP |
7.0 |
3 |