Pandas进阶修炼120题-第二期(Pandas数据处理,21-50题)

news2024/10/5 18:35:15

文章目录

  • Pandas进阶修炼120题
    • 第二期 Pandas数据处理
      • 21.读取本地EXCEL数据
      • 22.查看df数据前5行
      • 23.将salary列数据转换为最大值与最小值的平均值
        • 方法一:正则表达式(分别使用apply(),applymap(),map()来实现)
        • 方法二:apply + 自定义函数
      • 24.将数据根据学历进行分组并计算平均薪资
      • 25.将createTime列时间转换为月-日
        • 方法一:数据由时间戳格式转为时间日期格式,再修改格式
        • 方法二:常规方法(挨个修改)
        • 方法三:分别使用apply,applymap,map使用lambda 函数批量修改
      • 26.查看索引、数据类型和内存信息
      • 27.查看数值型列的汇总统计
      • 28.新增一列根据salary将数据分为三组
        • 方法一:pd.cut() 自定义箱子
        • 方法二:pd.qcut() 自动划分为数量大致相等的箱子
      • 29.按照salary列对数据降序排列
      • 30.取出第33行数据
        • 方法一:df.loc[n]
        • 方法二:df.iloc[n]
        • 方法三:df.iloc[n-1,:]
        • 方法四:df[n-1:n]
        • 方法五:df.iloc[n:n+1],df.loc[n:n+1]
      • 31.计算salary列的中位数
      • 32.绘制薪资水平频率分布直方图
        • 方法一:直接使用自带的plot绘制
        • 方法二:使用matplotlib.pyplot绘制
        • 方法三:方法二的拓展,添加数据标签
      • 33.绘制薪资水平密度曲线
        • 方法一:直接使用plot绘制
        • 方法二:使用seaborn画图
      • 34.删除最后一列categories
        • 方法一:指定labels,axis
        • 方法二:方法一(labels,axis = 1)的替代方法,columns = labels
      • 35.将df的第一列与第二列合并为新的一列
      • 36.将education列与salary列合并为新的一列
      • 37.计算salary最大值与最小值之差
        • 方法一:直接计算
        • 方法二:分别使用apply,applymap,map,并使用lambda函数来实现
      • 38.将第一行与最后一行拼接
        • 1.分步执行
        • 2.直接一句话执行
      • 39.将第8行数据添加至末尾
      • 40.查看每列的数据类型
      • 41.将createTime列设置为索引
      • 42.生成一个和df长度相同的随机数DataFrame
      • 43.将上一题生成的DataFrame与df合并
      • 44.生成新的一列new为salary列减去之前生成随机数列
      • 45.检查数据中是否含有任何缺失值
        • 方法一:判断行,列,行&列空值的方法
        • 方法二:标准答案使用.values的原因就是为了避免连续使用any()
      • 46.将salary列类型转换为浮点数
      • 47.计算salary大于10000的次数
      • 48.查看每种学历出现的次数
      • 49.查看education列共有几种学历
      • 50.提取salary与new列的和大于60000的最后3行
        • 方法一:布尔索引 + tail()
        • 方法二:标准答案解析

自己再写一遍的pandas习题,相比于标准答案添加了自己的理解与注释,也可直接下载链接上的习题
链接:https://pan.baidu.com/s/1arrqcBFZKqJngzRzUB2QfA?pwd=29eb
提取码:29eb
–来自百度网盘超级会员V3的分享

往期回顾:

第一期:pandas基础(1-20题)

Pandas进阶修炼120题

第二期 Pandas数据处理

21.读取本地EXCEL数据

import pandas as pd
df = pd.read_excel('pandas120_21_50.xlsx')

22.查看df数据前5行

df.head()
createTimeeducationsalary
02020-03-16 11:30:18本科20k-35k
12020-03-16 10:58:48本科20k-40k
22020-03-16 10:46:39不限20k-35k
32020-03-16 10:45:44本科13k-20k
42020-03-16 10:20:41本科10k-20k

23.将salary列数据转换为最大值与最小值的平均值

方法一:正则表达式(分别使用apply(),applymap(),map()来实现)

总结

· apply:应用在DataFrame的行或列中,也可以应用到单独一个Series的每个元素中

· map:应用在单独一个Series的每个元素中

· applymap:应用在DataFrame的每个元素中

import re

def func_re(x):
    """
    x:待解析的字符串
    方法:通过正则表达式解析最小值与最大值,然后输出平均值
    return:返回中间值
    """
    pattern = r'(\d+)k-(\d+)'
    matches = re.findall(r'(\d+)k-(\d+)k',x)[0]
    average_num = int(((int(matches[0]) + int(matches[1])) / 2) * 1000)
    return average_num
# 使用apply()进行数据转换
t_df = df[:].copy()

t_df['salary'] = t_df['salary'].apply(func_re)
t_df
createTimeeducationsalary
02020-03-16 11:30:18本科27500
12020-03-16 10:58:48本科30000
22020-03-16 10:46:39不限27500
32020-03-16 10:45:44本科16500
42020-03-16 10:20:41本科15000
............
1302020-03-16 11:36:07本科14000
1312020-03-16 09:54:47硕士37500
1322020-03-16 10:48:32本科30000
1332020-03-16 10:46:31本科19000
1342020-03-16 11:19:38本科30000

135 rows × 3 columns

# 使用map()进行数据转换
t_df = df[:].copy()

t_df['salary'] = t_df['salary'].map(func_re)
t_df
createTimeeducationsalary
02020-03-16 11:30:18本科27500
12020-03-16 10:58:48本科30000
22020-03-16 10:46:39不限27500
32020-03-16 10:45:44本科16500
42020-03-16 10:20:41本科15000
............
1302020-03-16 11:36:07本科14000
1312020-03-16 09:54:47硕士37500
1322020-03-16 10:48:32本科30000
1332020-03-16 10:46:31本科19000
1342020-03-16 11:19:38本科30000

135 rows × 3 columns

# 使用apply()进行数据转换
t_df = df[:].copy()

t_df['salary'] = t_df[['salary']].applymap(func_re) # 注意series是没有applymap的,需要对花式索引后的结果(DataFrame类型)使用
t_df
createTimeeducationsalary
02020-03-16 11:30:18本科27500
12020-03-16 10:58:48本科30000
22020-03-16 10:46:39不限27500
32020-03-16 10:45:44本科16500
42020-03-16 10:20:41本科15000
............
1302020-03-16 11:36:07本科14000
1312020-03-16 09:54:47硕士37500
1322020-03-16 10:48:32本科30000
1332020-03-16 10:46:31本科19000
1342020-03-16 11:19:38本科30000

135 rows × 3 columns

方法二:apply + 自定义函数

和方法一不同的是使用已有的函数来对字符串提取分离

t_df = df[:].copy()

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


t_df = t_df.apply(func, axis=1)
t_df
createTimeeducationsalary
02020-03-16 11:30:18本科27500
12020-03-16 10:58:48本科30000
22020-03-16 10:46:39不限27500
32020-03-16 10:45:44本科16500
42020-03-16 10:20:41本科15000
............
1302020-03-16 11:36:07本科14000
1312020-03-16 09:54:47硕士37500
1322020-03-16 10:48:32本科30000
1332020-03-16 10:46:31本科19000
1342020-03-16 11:19:38本科30000

135 rows × 3 columns

# strip()函数用于去除字符串两侧的空格,也可以去除别的字符比如strip(k)

def func(df):
    # 先将字符串以'-'分割
    lst = df['salary'].split('-') # 这个地方有点奇怪,函数外直接这么写是错的,会报错AttributeError: 'Series' object has no attribute 'split'
    # 分割后的字符串去除掉‘k’,再转为整形,即为最小值与最大值
    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) #注意函数中如果是直接对df某一列操作的,需要说明axis = 1
df
createTimeeducationsalary
02020-03-16 11:30:18本科27500
12020-03-16 10:58:48本科30000
22020-03-16 10:46:39不限27500
32020-03-16 10:45:44本科16500
42020-03-16 10:20:41本科15000
............
1302020-03-16 11:36:07本科14000
1312020-03-16 09:54:47硕士37500
1322020-03-16 10:48:32本科30000
1332020-03-16 10:46:31本科19000
1342020-03-16 11:19:38本科30000

135 rows × 3 columns

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

# 方法一:
df.groupby(by = ['education'])[['salary']].mean()
salary
education
不限19600.000000
大专10000.000000
本科19361.344538
硕士20642.857143
# 方法二:标准答案,可以看出groupby后直接.mean()只会对salary奏效
df.groupby(by = ['education']).mean()
C:\Users\Cheng\AppData\Local\Temp\ipykernel_9028\3549734645.py:2: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
  df.groupby(by = ['education']).mean()
salary
education
不限19600.000000
大专10000.000000
本科19361.344538
硕士20642.857143

25.将createTime列时间转换为月-日

to_pydatetime()函数:用于将时间序列数据转换为Python的datetime对象

strftime()函数:用于将日期时间格式化为字符串。它接受一个日期时间对象和一个格式化字符串作为参数,并返回一个格式化后的字符串。

思路:先将字符串转换为datetime对象,在确定格式后重新已字符串的形式存储

此外,标准答案中的ix要被版本淘汰了,尽量使用其他的做替换

方法一:数据由时间戳格式转为时间日期格式,再修改格式

要将createTime列转换为月-日格式,可以使用strftime()函数修改格式,但它需要接受日期时间对象。

可以使用pandas中的dt访问器,它提供了对Series值的datetime属性的访问。

t_df = df[:].copy()

# t_df['createTime'] = t_df['createTime'].to_datetime() # 直接写这句会报错,AttributeError: 'Series' object has no attribute 'to_datetime'
t_df['createTime'] = pd.to_datetime(t_df['createTime'])
t_df['createTime'] = t_df['createTime'].dt.strftime("%m-%d") # .strftime("%m-%d")
t_df
createTimeeducationsalary
003-16本科27500
103-16本科30000
203-16不限27500
303-16本科16500
403-16本科15000
............
13003-16本科14000
13103-16硕士37500
13203-16本科30000
13303-16本科19000
13403-16本科30000

135 rows × 3 columns

方法二:常规方法(挨个修改)

要将createTime列转换为月-日格式,可以使用strftime()函数修改格式,但它需要接受日期时间对象。

可以使用iloc访问并修改每个时间戳的格式,使用to_pydatetime()来转换格式。

t_df = df[:].copy()

length = len(t_df)
for i in range(length):
    t_df.iloc[i,0] = t_df.iloc[i,0].to_pydatetime().strftime("%m-%d")
t_df
createTimeeducationsalary
003-16本科27500
103-16本科30000
203-16不限27500
303-16本科16500
403-16本科15000
............
13003-16本科14000
13103-16硕士37500
13203-16本科30000
13303-16本科19000
13403-16本科30000

135 rows × 3 columns

方法三:分别使用apply,applymap,map使用lambda 函数批量修改

方法二的lambda函数版本

t_df = df[:].copy()

t_df['createTime'] = t_df['createTime'].apply(lambda x:x.to_pydatetime().strftime("%m-%d"))
t_df
createTimeeducationsalary
003-16本科27500
103-16本科30000
203-16不限27500
303-16本科16500
403-16本科15000
............
13003-16本科14000
13103-16硕士37500
13203-16本科30000
13303-16本科19000
13403-16本科30000

135 rows × 3 columns

t_df = df[:].copy()

t_df['createTime'] = t_df[['createTime']].applymap(lambda x:x.to_pydatetime().strftime("%m-%d"))
t_df
createTimeeducationsalary
003-16本科27500
103-16本科30000
203-16不限27500
303-16本科16500
403-16本科15000
............
13003-16本科14000
13103-16硕士37500
13203-16本科30000
13303-16本科19000
13403-16本科30000

135 rows × 3 columns

df['createTime'] = df['createTime'].map(lambda x:x.to_pydatetime().strftime("%m-%d"))
df
createTimeeducationsalary
003-16本科27500
103-16本科30000
203-16不限27500
303-16本科16500
403-16本科15000
............
13003-16本科14000
13103-16硕士37500
13203-16本科30000
13303-16本科19000
13403-16本科30000

135 rows × 3 columns

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

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 135 entries, 0 to 134
Data columns (total 3 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   createTime  135 non-null    object
 1   education   135 non-null    object
 2   salary      135 non-null    int64 
dtypes: int64(1), object(2)
memory usage: 3.3+ KB

27.查看数值型列的汇总统计

df.describe()
salary
count135.000000
mean19159.259259
std8661.686922
min3500.000000
25%14000.000000
50%17500.000000
75%25000.000000
max45000.000000

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

方法一:pd.cut() 自定义箱子

t_df = df[:].copy()

bins = [0,5000,15000,float('inf')]
labels = ['low','middle','high']

t_df['salary-category'] = pd.cut(t_df['salary'],bins = bins,labels = labels)
t_df
createTimeeducationsalarysalary-category
003-16本科27500high
103-16本科30000high
203-16不限27500high
303-16本科16500high
403-16本科15000middle
...............
13003-16本科14000middle
13103-16硕士37500high
13203-16本科30000high
13303-16本科19000high
13403-16本科30000high

135 rows × 4 columns

t_df.groupby(by = ['salary-category'])['salary'].count()
salary-category
low        9
middle    47
high      79
Name: salary, dtype: int64

方法二:pd.qcut() 自动划分为数量大致相等的箱子

labels = ['low','middle','high']

df['salary-category'] = pd.qcut(df['salary'],q = 3,labels = labels)
df
createTimeeducationsalarysalary-category
003-16本科27500high
103-16本科30000high
203-16不限27500high
303-16本科16500middle
403-16本科15000low
...............
13003-16本科14000low
13103-16硕士37500high
13203-16本科30000high
13303-16本科19000middle
13403-16本科30000high

135 rows × 4 columns

df.groupby(by = ['salary-category'])['salary'].count()
salary-category
low       56
middle    41
high      38
Name: salary, dtype: int64

29.按照salary列对数据降序排列

df.sort_values(by = ['salary'],ascending = False,inplace = True,ignore_index = True)
df
createTimeeducationsalarysalary-category
003-16本科45000high
103-16本科40000high
203-16本科37500high
303-16本科37500high
403-16硕士37500high
...............
13003-16本科4500low
13103-16本科4000low
13203-16本科4000low
13303-16不限3500low
13403-16本科3500low

135 rows × 4 columns

30.取出第33行数据

方法一:df.loc[n]

df.loc[32]
createTime         03-16
education             本科
salary             25000
salary-category     high
Name: 32, dtype: object

方法二:df.iloc[n]

df.iloc[32]
createTime         03-16
education             本科
salary             25000
salary-category     high
Name: 32, dtype: object

方法三:df.iloc[n-1,:]

df.iloc[32,:]
createTime         03-16
education             本科
salary             25000
salary-category     high
Name: 32, dtype: object

方法四:df[n-1:n]

df[32:33]
createTimeeducationsalarysalary-category
3203-16本科25000high

方法五:df.iloc[n:n+1],df.loc[n:n+1]

需要注意的是,’ iloc ‘和’ loc '也可以接受一个范围,例如 df .iloc[N:N+1] or df.loc[N:N+1] ,这些也会返回一个DataFrame。

df.loc[32:33]
createTimeeducationsalarysalary-category
3203-16本科25000high
3303-16本科25000high

31.计算salary列的中位数

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

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

方法一:直接使用自带的plot绘制

df['salary'].plot(kind = 'hist',edgecolor = 'black')

在这里插入图片描述

方法二:使用matplotlib.pyplot绘制

import matplotlib.pyplot as plt

plt.hist(df['salary'],bins = 10,edgecolor = 'black') # bins默认为10
plt.title('Frequency Distribution of Salary Levels')
plt.xlabel('Salary')
plt.ylabel('Frequency')
plt.show()


在这里插入图片描述

方法三:方法二的拓展,添加数据标签

n,bins,patches = plt.hist(df[‘salary’], bins=10, edgecolor=‘black’)创建直方图并返回三个对象:n(直方图bins的值),bins (bins的边缘)和patches(用于创建直方图的单个patch)。

for循环遍历直方图中的每个patch。对于每个补丁,plt.text()用于添加文本标签。plt.text()的前两个参数指定文本的位置(在本例中是补丁上边缘的中心),第三个参数是要添加的文本(在本例中是bin的值,格式为整数)。ha = 'center’指定文本水平居中。

其余的代码与前面相同。

import matplotlib.pyplot as plt

n, bins, patches = plt.hist(df['salary'],bins = 10,edgecolor = 'black')

"""
print(n) # [12.  8. 36. 31. 12.  8. 20.  3.  4.  1.]
print(bins) # [ 3500.  7650. 11800. 15950. 20100. 24250. 28400. 32550. 36700. 40850. 45000.]
print(patches) # <BarContainer object of 10 artists>
"""

# Add labels to each bin
for i in range(len(patches)):
    plt.text(
        patches[i].get_x()+patches[i].get_width()/2.,
        patches[i].get_height(),
        f'{n[i]:.0f}',
        ha = 'center'
    )
plt.title('Frequency Distribution of Salary Levels')
plt.xlabel('Salary')
plt.ylabel('Frequency')
plt.show()

在这里插入图片描述

33.绘制薪资水平密度曲线

直方图和密度曲线的关系:

直方图和密度曲线(也称为水平曲线或核密度估计)都是可用于分析数据集分布的图形表示。它们提供了类似的信息,但它们的呈现方式略有不同。

直方图:直方图是数据集分布的图形表示。它是对一个连续变量的概率分布的估计。要构造一个直方图,第一步是对范围内的值进行“分组”——也就是说,将整个范围内的值分成一系列的区间——然后计算每个区间内有多少个值。箱子通常被指定为一个变量的连续的、不重叠的间隔。绘制的值表示每个bin内的观测值计数。

密度曲线(平坦度曲线):密度曲线是直方图的平滑版本,用于可视化分布的“形状”。它是直方图的一种变体,使用核平滑来绘制值,通过平滑噪声来实现更平滑的分布。密度图的峰值有助于显示值在区间内的集中位置。y轴表示密度:曲线在给定x值处的高度表示该值出现的概率密度。

两者之间的关系是,它们都提供了数据分布的可视化解释。直方图只提供每个箱中值的原始计数,而密度曲线提供了更平滑的分布估计。密度图曲线下的面积(或直方图中条形图的总面积)之和为1。

在许多情况下,密度图可能受箱宽选择的影响较小,并且通常可以更好地理解分布的形状,使其成为许多数据分析师的首选,而不是直方图。然而,直方图对于非技术人员来说可能更直观,因为它们提供了不同类别中数据计数的直观表示。

方法一:直接使用plot绘制

df.salary.plot(kind = 'kde',xlim = (0,80000))
<Axes: ylabel='Density'>

在这里插入图片描述

方法二:使用seaborn画图

import seaborn as sns
import matplotlib.pyplot as plt

sns.kdeplot(df['salary'],color = 'darkblue')
plt.title('Density Plot of Salary Levels')
plt.xlabel('Salary')
plt.ylabel('Density')
plt.show()

在这里插入图片描述

34.删除最后一列categories

注意:默认情况下,drop不会修改DataFrame;它返回一个删除指定行或列的新DataFrame。

如果你想就地修改DataFrame,你可以传递inplace=True给drop。

方法一:指定labels,axis

t_df = df[:].copy()

t_df.drop(labels = ['salary-category'],axis = 1,inplace = True)
t_df.head()
createTimeeducationsalary
003-16本科45000
103-16本科40000
203-16本科37500
303-16本科37500
403-16硕士37500

方法二:方法一(labels,axis = 1)的替代方法,columns = labels

df.drop(columns = ['salary-category'],inplace = True)
df.head()
createTimeeducationsalary
003-16本科45000
103-16本科40000
203-16本科37500
303-16本科37500
403-16硕士37500

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

df['new_Column'] = df['createTime'] + df['education']
df.head()
createTimeeducationsalarynew_Column
003-16本科4500003-16本科
103-16本科4000003-16本科
203-16本科3750003-16本科
303-16本科3750003-16本科
403-16硕士3750003-16硕士

36.将education列与salary列合并为新的一列

df['new_Column2'] = df['education'] + df['salary'].map(str)
df.head()
createTimeeducationsalarynew_Columnnew_Column2
003-16本科4500003-16本科本科45000
103-16本科4000003-16本科本科40000
203-16本科3750003-16本科本科37500
303-16本科3750003-16本科本科37500
403-16硕士3750003-16硕士硕士37500

37.计算salary最大值与最小值之差

方法一:直接计算

df['salary'].max() - df['salary'].min()
41500

方法二:分别使用apply,applymap,map,并使用lambda函数来实现

pandas中的map、apply和applymap函数分别用于将函数应用于series、series/dateframe或dataframe的元素。但是,计算列的最大值和最小值之间的差值是对整个序列的操作,而不是对单个元素的操作,因此通常不会使用这些函数来完成。

话虽如此,如果你真的想使用map, apply和applymap与lambda函数来解决这个问题,你可以做下面的事情:

1:使用apply:

apply用于沿dateframe的axis应用函数。

在此代码中,lambda函数计算“salary”列的最大值和最小值之间的差值。

你可以这样使用它:

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

2:使用map:

map用于series中每个元素的函数。

在这段代码中,lambda函数从每个工资中减去最低工资,然后使用max()找到这些值中的最大值,即最高工资和最低工资之间的差值。

df['salary'].map(lambda x:x-df['salary'].min()).max()
41500

3:使用applymap:

applymap用于dataframe中每个元素的函数。所以需要选择‘salary’列作为dataframe而非series。

这段代码与前面的代码类似,但是df[[‘salary’]]用于选择’salary’列作为dataframe,并且使用applymap代替map。

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

38.将第一行与最后一行拼接

1.分步执行

# 获取第一行
first_row = df.iloc[[0]]
# 获取最后一行
last_row = df.iloc[[-1]]
# 拼接
frames = [first_row,last_row]
df_concat = pd.concat(frames,ignore_index = True)
# 重置索引
df_concat.reset_index(drop = True,inplace = True)

df_concat
createTimeeducationsalarynew_Columnnew_Column2
003-16本科4500003-16本科本科45000
103-16本科350003-16本科本科3500

2.直接一句话执行

df_concat = pd.concat([df[:1],df[-2:-1]],ignore_index = True).reset_index(drop = True)
df_concat
createTimeeducationsalarynew_Columnnew_Column2
003-16本科4500003-16本科本科45000
103-16不限350003-16不限不限3500

39.将第8行数据添加至末尾

df.append(df.iloc[[7]])
C:\Users\Cheng\AppData\Local\Temp\ipykernel_9028\3138359087.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  df.append(df.iloc[[7]])
createTimeeducationsalarynew_Columnnew_Column2
003-16本科4500003-16本科本科45000
103-16本科4000003-16本科本科40000
203-16本科3750003-16本科本科37500
303-16本科3750003-16本科本科37500
403-16硕士3750003-16硕士硕士37500
..................
13103-16本科400003-16本科本科4000
13203-16本科400003-16本科本科4000
13303-16不限350003-16不限不限3500
13403-16本科350003-16本科本科3500
703-16本科3500003-16本科本科35000

136 rows × 5 columns

40.查看每列的数据类型

df.dtypes
createTime     object
education      object
salary          int64
new_Column     object
new_Column2    object
dtype: object

41.将createTime列设置为索引

df.set_index('createTime')
df
createTimeeducationsalarynew_Columnnew_Column2
003-16本科4500003-16本科本科45000
103-16本科4000003-16本科本科40000
203-16本科3750003-16本科本科37500
303-16本科3750003-16本科本科37500
403-16硕士3750003-16硕士硕士37500
..................
13003-16本科450003-16本科本科4500
13103-16本科400003-16本科本科4000
13203-16本科400003-16本科本科4000
13303-16不限350003-16不限不限3500
13403-16本科350003-16本科本科3500

135 rows × 5 columns

42.生成一个和df长度相同的随机数DataFrame

df_1 = pd.DataFrame(pd.Series(np.random.randint(1,10,135)))
df_1
0
03
18
22
32
47
......
1306
1315
1325
1331
1344

135 rows × 1 columns

43.将上一题生成的DataFrame与df合并

df = pd.concat([df,df_1],ignore_index = True,axis = 1)
df.columns = ['createTime','education','salary','new_Column','new_Column2','randint']
df
createTimeeducationsalarynew_Columnnew_Column2randint
003-16本科4500003-16本科本科450003
103-16本科4000003-16本科本科400008
203-16本科3750003-16本科本科375002
303-16本科3750003-16本科本科375002
403-16硕士3750003-16硕士硕士375007
.....................
13003-16本科450003-16本科本科45006
13103-16本科400003-16本科本科40005
13203-16本科400003-16本科本科40005
13303-16不限350003-16不限不限35001
13403-16本科350003-16本科本科35004

135 rows × 6 columns

44.生成新的一列new为salary列减去之前生成随机数列

df['new'] = df['salary'] - df['randint']
df
createTimeeducationsalarynew_Columnnew_Column2randintnew
003-16本科4500003-16本科本科45000344997
103-16本科4000003-16本科本科40000839992
203-16本科3750003-16本科本科37500237498
303-16本科3750003-16本科本科37500237498
403-16硕士3750003-16硕士硕士37500737493
........................
13003-16本科450003-16本科本科450064494
13103-16本科400003-16本科本科400053995
13203-16本科400003-16本科本科400053995
13303-16不限350003-16不限不限350013499
13403-16本科350003-16本科本科350043496

135 rows × 7 columns

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

在Python中,DataFrame通常与pandas库相关联。要检查DataFrame中的空缺或缺失值,可以使用pandas提供的’ isnull() ‘或’ isna() '函数。

在上面的例子中,’ isnull() ‘函数返回与原始形状相同的DataFrame,但包含指示每个元素是否缺失的布尔值。然后,’ any() '函数检查每列或每行中是否有任何值为True, ’ any().any() '检查整个DataFrame中是否有任何True值。

方法一:判断行,列,行&列空值的方法

# 判断行是否有空值
column_vacancies = df.isnull().any()
# 判断列是否有空值
row_vacancies = df.isnull().any(axis = 1)
# 判断整个DataFrame中是否有空值
is_vacant = df.isnull().any().any()
# 打印结果
print(column_vacancies)
print("-------------------------------")
print(row_vacancies)
print("-------------------------------")
print(is_vacant)
createTime     False
education      False
salary         False
new_Column     False
new_Column2    False
randint        False
new            False
dtype: bool
-------------------------------
0      False
1      False
2      False
3      False
4      False
       ...  
130    False
131    False
132    False
133    False
134    False
Length: 135, dtype: bool
-------------------------------
False

方法二:标准答案使用.values的原因就是为了避免连续使用any()

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

46.将salary列类型转换为浮点数

df['salary'] = df['salary'].astype('float')
df.dtypes
createTime      object
education       object
salary         float64
new_Column      object
new_Column2     object
randint          int32
new              int64
dtype: object

47.计算salary大于10000的次数

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

48.查看每种学历出现的次数

df['education'].value_counts()
本科    119
硕士      7
不限      5
大专      4
Name: education, dtype: int64

49.查看education列共有几种学历

df['education'].nunique()
4

50.提取salary与new列的和大于60000的最后3行

方法一:布尔索引 + tail()

filtered_df = df[df['salary'] + df['new'] > 60000]
filtered_df.tail(3)
createTimeeducationsalarynew_Columnnew_Column2randintnew
603-16本科35000.003-16本科本科35000934991
703-16本科35000.003-16本科本科35000634994
803-16本科32500.003-16本科本科32500132499

方法二:标准答案解析

df1 = df[['salary','new']] # 通过花式索引选择salary和new列为新的DataFrame df1

rowsums = df1.apply(np.sum,axis = 1) # rowsums是df1中包含每一行的和的值的Series。np.sum沿着axis=1去计算每一行的值

# 基于rowsums大于60000的条件对df进行筛选
# 其中,np.where(rownums > 60000)[0]当条件为True的时候返回索引序列
# [-3:] 从索引序列中选择后三个索引
# 最后df.iloc用于根据索引从是原始DataFrame中选择对应的行,":",用于选择所有的列
res = df.iloc[np.where(rowsums > 60000)[0][-3:], :]

res

createTimeeducationsalarynew_Columnnew_Column2randintnew
603-16本科35000.003-16本科本科35000934991
703-16本科35000.003-16本科本科35000634994
803-16本科32500.003-16本科本科32500132499

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wifi芯片原理

一、在系统中的位置 基带&#xff08;baseband&#xff09; 基带的作用有三个&#xff1a; 1、队列包的管理 2、调试解调 3、CSMA/CA机制 CSMA/CA的全称是Carrier Sense Multiple Access with Collision Avoidance&#xff0c;即载波侦听多路访问&#xff0f;冲突避免。 各…

java——集合框架

文章目录 接口实现&#xff08;类&#xff09;算法1. 排序算法2. 查找算法3. 拷贝算法4. 填充算法5. 比较算法6. 随机算法7. 迭代器算法8. 交集、并集、差集9. 分割集合10. 数组和集合的互转 集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容&#x…

C++手撕红黑树

目录&#xff1a; 红黑树的概念红黑树的性质红黑树节点的定义 红黑树结构红黑树的插入操作红黑树的验证红黑树的代码实现 红黑树的删除红黑树与AVL树的比较红黑树的应用 总结 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结…

DevOps系列文章之 Spring Boot Docker打包

应用准备容器化&#xff0c;因为几十个应用从测试到发布太麻烦了&#xff0c;而且还会因为环境的因素导致部署中出现各种问题。为了在开发、测试、生产都能保持一致的环境&#xff0c;就引进了容器技术&#xff0c;而目前常用的应用使用基于spring boot的。 在Spring Boot应用…

AI数字人之语音驱动面部模型及超分辨率重建Wav2Lip-HD

1 Wav2Lip-HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型&#xff0c;它们被用于实现数字人的语音和图像方面的功能。通过Wav2Lip-HD项目可以快速使用这两种模型&#xff0c;完成高清数字人形象的打造。 项目代码地址&#xff1a;github地址 1.1…

Canal监听MySQL

Canal监听MySQL 1、Mysql数据库开启binlog模式 注意&#xff1a;Mysql容器&#xff0c;此处Mysql版本为5.7 #进入容器 docker exec -it mysql /bin/bash #进入配置目录 cd /etc/mysql/mysql.conf.d #修改配置文件 vi mysqld.cnf(1) 修改mysqld.cnf配置文件&#xff0c;添加如…

Android:安卓开发使用okHttp进行网络请求和MySQL数据库完成图书馆管理系统APP

1、总体目标 1.1 项目概述 项目名称&#xff1a;基于安卓平台的图书管理系统。 本项目旨在研发一个图书管理系统&#xff0c;实现图书馆的信息化管理。在方便用户在线浏览&#xff0c;借阅&#xff0c;归还图书&#xff0c;方便图书馆管理员对图书进行管理。能很好的为用户提…

从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

1 中断处理程序的基本要求 当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是中断执行完毕后要恢复到原来执行的程序,除了时间流逝外,原来运行的程序应该毫无感知。 具体到Armv…

如何设计一个短信发送功能

本文主要分享了如何设计一个发送短信功能。 一、总结简述 1.梳理多个平台短信API的发送参数&#xff0c;集成封装提供统一的API&#xff0c;支持多个短信平台&#xff08;阿里云、腾讯云、百度云、京东云、七牛云&#xff09;灵活切换 2.提供存储方案&#xff0c;表结构设计…

Redis数据库操作

Redis 命令参考 — Redis 命令参考http://doc.redisfans.com/ 1、Redis&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库 特征&#xff1a; 键值型&#xff0c;支持多种不同数据结构&#xff0c;功能丰富 单线程&#xff0c;每个命令具备原子性 …

C语言督学营(中级阶段)

文章目录 中级阶段9.数据结构概述逻辑结构 与 存储结构时间复杂度、空间复杂度 10.11.12.线性表 (代码实战)线性表的定义、特点1.线性表的顺序存储(顺序表示)&#xff1a;顺序表静态分配动态分配顺序表的定义、初始化、插入、删除、按值查找、按位查找 操作 (代码)&#xff1a;…

go开发多云资产管理平台

go开发多云资产管理平台cmdb 代码仓库github.com/yunixiangfeng/gocmdb 云主机管理 主机资源监控 开发流程 Welcome to Beego | Beego bee new gocmdb/servercd gocmdb/servergo mod tidygo get -u github.com/beego/beego/v2 go get -u "github.com/astaxie/beego/o…

津津乐道设计模式 - 模版模式详解(以女友化妆流程带你彻底明白)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

JDBC-->java如何连接数据库(详细版小白必备)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

工业相机——显微镜头/放大镜头

校准尺&#xff0c;最小测量刻度为0.1mm 上图为手机拍的看不清&#xff0c;放了一个网上找的图&#xff0c;校准的详细参数见下图 例如&#xff1a;物距为116mm的显微镜头&#xff0c;这种镜头没有景深&#xff0c;只能测镜头前端到物体116mm的物体 &#xff0c;几乎没有景深&a…

Vscode配置C/C++环境出现报错,导致不能运行代码,报错如下:

Vscode配置C/C环境出现报错&#xff0c;导致不能运行代码&#xff0c;报错如下&#xff1a; 问题描述—gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次…

Hexo博客搭建 —— Next主题配置

Hexo博客搭建 —— Next主题配置 文章目录 Hexo博客搭建 —— Next主题配置配置文件区分站点配置文件主题配置文件 配置文件描述简称引入next主题-sitenext主题页面模式设置-next设置首页不显示全文-site设置博客文章持久化连接-site下载插件URL Setting 参考文档 配置文件区分…

【Docker】一文了解DockerFile

文章目录 Dockerfile 概念DockerFile的指令1、FROM 指定基础镜像2、RUN 执行命令3、COPY 复制文件4、ADD 更高级的复制文件5、ENV 设置环境变量6、EXPOSE7、VOLUME 定义匿名卷8、CMD容器启动命令9、ENTRYPOINT入口点10、USER 指定当前用户11、WORKDIR 指定工作目录12、LABEL为镜…

网络安全、Web安全、渗透测试之笔经面经总结含答案

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

4、数据库操作语句:聚合函数

目录 1、定义 2、常用的聚合函数 1&#xff09;Avg/sum&#xff1a;只适用于数值类型的字段&#xff08;或变量&#xff09;。 2&#xff09;Max/min:适用于数值类型、字符串类型、日期时间类型的字段&#xff08;或变量&#xff09; 3&#xff09;Count&#xff1a; ①作…