b站pandas编程练习100例
题1 使用 List 构造 Series
使用 pandas,把下方数据 List,变为一个 Series,将 Series 输出到命令行
courses=['语文','数学','英语','计算机']
题解:
import pandas as pd
courses=['语文','数学','英语','计算机']
pd.Series(courses)
题2 使用 Dict 构造 Series
使用 pandas,把下方数据 Dict,变为一个 Series,将 Series 输出到命令行
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
题解:
import pandas as pd
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
pd.Series(grades)
题3 将 Series 转换为 List
使用 pandas,将 Series 变成一个数据 List,将 List 输出到命令行
import pandas as pd
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
ser=pd.Series(grades)
题解:
ser.tolist()
题4 将 Series 转换为 DataFrame
将 Series 变为一个数据 DataFrame,数据列命名为 grade,输出到命令行
import pandas as pd
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
ser=pd.Series(grades)
题解:
pd.DataFrame(ser,columns=['grade'])
题5 用 Numpy 创建 Series
使用 numpy 和 pandas 配合完成
注意:类型 float,数值10~90,每两个数字间隔10
题解:
import pandas as pd
import numpy as np
index=np.arange(101,110)
data=np.arange(10,100,10,dtype=float)
pd.Series(data,index)
题6 转换 Series 的数据类型
输入:Series,字符串类型
import pandas as pd
s=pd.Series(data=['001','002','003','004'],index=list('abcd'))
输出:Series,数字类型
题解:
# 方法一:astype()
s.astype(int)
# 方法二:map()
s.map(int)
# 方法三:apply()
def to_int(x):
return int(x)
s.apply(to_int)
题7 给 Series 添加元素
输入:Series
import pandas as pd
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
ser=pd.Series(grades)
处理:添加2个元素到 Series
题解:
# 方法一:append()
dic2={'物理':88,'化学':96}
ser2=pd.Series(dic2)
ser.append(ser2)
# 方法二:直接添加
ser['物理']=88
ser['化学']=96
ser
题8 Series 转化为 DataFrame
输入:Series
import pandas as pd
grades={'语文':80,'数学':90,'英语':85,'计算机':100}
ser=pd.Series(grades)
输出:DataFrame
注意:结果 DataFrame 有两列,列名需要设定
题解:
# ser.reset_index():把 Series 的索引列重置为 DataFrame 的数据列之一
# df.columns:通过属性修改列名
df=ser.reset_index()
df.columns=['course','grade']
df
题9 创建一个 DataFrame
提示:给 DataFrame 传一个字典创建
题解:
import pandas as pd
dic={'姓名':['小张','小王','小李','小赵'],
'性别':['男','女','男','女'],
'年龄':[18,19,20,18]}
pd.DataFrame(dic)
题10 设置 DataFrame 的索引列
输入:DataFrame
输出:设置了索引列的 DataFrame
import pandas as pd
dic={'姓名':['小张','小王','小李','小赵'],
'性别':['男','女','男','女'],
'年龄':[18,19,20,18]}
df=pd.DataFrame(dic)
题解:
# 方法一:set_index()
df.set_index('姓名')
# 方法二:index、drop()
df.index=df['姓名']
df.drop(columns='姓名')
df
题11 生成一个月份的所有天
输出:2021年10月,一个月的日期列表
题解:
import pandas as pd
pd.date_range('2021-10-01',periods=31,freq='D')
# pd.date_range('2021-10-01','2021-10-31',freq='D')
题12 生成一年的所有周一
输出:2021年,所有周一的日期列表
题解:
import pandas as pd
pd.date_range(start='2021-01-01',end='2021-12-31',freq='W-MON')
题13 生成一天中所有的小时
输出:2021-10-01,当天所有的小时时间
题解:
import pandas as pd
# pd.date_range('2021-10-01',periods=24,freq='H')
pd.date_range('2021-10-01','2021-10-02',freq='H',closed='left')# 左闭右开
题14 生成日期 DataFrame
输出:DataFrame,包含2021年10月的31天,以及每天是2021年的第几天
题解:
import pandas as pd
# import datetime as dt
data=pd.date_range('2021-10',periods=31)
df=pd.DataFrame(data,columns=['day'])
df['day_of_year']=df['day'].dt.dayofyear # dt 访问日期的方法,dayofyear 返回是本年第几天的属性
df
题15 生成日期和随机分布 DataFrame
输出:DataFrame,包含三列
1000个日期作为索引,从2021-01-01开始
数据列:正态分布1000个随机数,loc=0,scale=1
数据列:均匀分布1000个随机数,low=0,high=1
数据列:二项分布1000个随机数,n=1,p=0.2
题解:
import pandas as pd
import numpy as np
index=pd.date_range('2021-01-01',periods=1000)
dic={'norm':np.random.normal(loc=0,scale=1,size=1000),
'uniform':np.random.uniform(low=0,high=1,size=1000),
'binomial':np.random.binomial(n=1,p=0.2,size=1000)}
pd.DataFrame(dic,index)
题16 打印 DataFrame 的前后数据行
输入:DataFrame
import pandas as pd
index=pd.date_range('2021-01-01',periods=1000)
dic={'norm':np.random.normal(loc=0,scale=1,size=1000),
'uniform':np.random.uniform(low=0,high=1,size=1000),
'binomial':np.random.binomial(n=1,p=0.2,size=1000)}
df=pd.DataFrame(dic,index)
输出:打印 df 的前面10行,打印空行,打印 df 的后面5行
题解:
import pandas as pd
df.head(10)
print('\n')
df.tail()
题17 查看 df 的信息和基本数据统计
输入:DataFrame
import pandas as pd
index=pd.date_range('2021-01-01',periods=1000)
dic={'norm':np.random.normal(loc=0,scale=1,size=1000),
'uniform':np.random.uniform(low=0,high=1,size=1000),
'binomial':np.random.binomial(n=1,p=0.2,size=1000)}
df=pd.DataFrame(dic,index)
输出:查看多少行、多少列、类型等基本信息,打印空行,查看每列的平均值、最小值、最大值、中位数等统计信息
题解:
import pandas as pd
df.info()
print('\n')
df.describe()
题18 统计数据列的值出现次数
输入:对如下 df,计算 binomial 列每个值出现了多少次
import pandas as pd
index=pd.date_range('2021-01-01',periods=1000)
dic={'norm':np.random.normal(loc=0,scale=1,size=1000),
'uniform':np.random.uniform(low=0,high=1,size=1000),
'binomial':np.random.binomial(n=1,p=0.2,size=1000)}
df=pd.DataFrame(dic,index)
题解:
import pandas as pd
# 方法一:df['...'].value_counts()
df['binomial'].value_counts()
# 方法二:df.groupby()...count()
df.groupby(by=['binomial'])['binomial'].count()
题19 df 前 n 行存入 csv 文件
输入:对如下数据 df,取前100行记录,存入 csv 文件
import pandas as pd
index=pd.date_range('2021-01-01',periods=1000)
dic={'norm':np.random.normal(loc=0,scale=1,size=1000),
'uniform':np.random.uniform(low=0,high=1,size=1000),
'binomial':np.random.binomial(n=1,p=0.2,size=1000)}
df=pd.DataFrame(dic,index)
题解:
import pandas as pd
df_100=df.iloc[:100,:]
df_100.to_csv('题19_b站pandas编程练习100例.csv')
题20 加载 csv 文件到 df
注意:保留日期为索引列
题解:
import pandas as pd
# index_col 默认不使用第一列作为索引,设定 index_col 列索引为某一列,设定 engine 可避免文件中文命名导致的 csv 初始化失败
pd.read_csv('题19_b站编程练习100例.csv',engine='python',index_col=0)
题21 加载股票 csv 文件到 df
某互联网公司股票数据,数据是 csv 格式,使用 pandas 加载到 df,进行打印
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv')
df
题22 查看基本信息和数据统计
数据是 csv 格式,加载到 dataframe,查看数据的基本信息,查看基本数据统计
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv',index_col=0) # 把第0列作为索引
df.info()
df.describe()
题23 更改索引列为普通数据列
某互联网公司股票数据,数据是 csv 格式,以 index_col=0,加载 dataframe,把 data 列变为普通列
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv',index_col=0) # 把第0列作为索引
题解:
df2.reset_index() # 重置为默认数字索引
题24 给数据添加月份和年份
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,给数据添加列:月份、年份,打印结果 dataframe
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv')
# 方法一:.dt.year / .dt.month
df['Date']=pd.to_datetime(df['Date']) # 设为日期类型
df['Month']=df['Date'].dt.month # 时间类型.dt可访问属性
df['Year']=df['Date'].dt.year
df.set_index('Date')
# 方法二:apply()
df['Date']=pd.to_datetime(df['Date']) # 设为日期类型
def to_month(x):
x=str(x)
x=x[5:7]
return x
def to_year(x):
x=str(x)
x=x[0:4]
return x
df['Month']=df['Date'].apply(to_month)
df['Year']=df['Date'].apply(to_year)
df.set_index('Date')
题25 计算股票每年份的平均收盘价
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,给数据添加列:年份,计算每年的平均收盘价
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv')
df['Date']=pd.to_datetime(df['Date']) # 设为日期格式
df['Year']=df['Date'].dt.year # .dt.year访问时间属性
df.groupby(by=['Year'])['Close'].mean()
题26 找出收盘价最低的数据行
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,找出收盘价最低的索引,根据索引找出数据行,打印结果数据行
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv',index_col=0)
idx=df['Close'].argmin() # 返回最小值的索引
df.loc[idx,:] # 通过索引取记录
题27 筛选出部分数据列
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,只筛选出如下数据列的 df:Date、Open、Close、Volume
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv')
df[['Date','Open','Close','Volume']]
df.set_index('Date')
题28 设置日期列为索引列
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,设置 Date 列为索引列,打印结果 dataframe
题解:
import pandas as pd
# 方法一:index_col参数
# pd.read_csv('internet_company_stock_data.csv',index_col=0)
# 方法二:set_index()
df=pd.read_csv('internet_company_stock_data.csv')
df.set_index('Date')
题29 删除不需要的数据列
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,删除 High、Low 两列,打印结果 dataframe
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv',index_col=0)
# 方法一:drop()
df=df.drop(columns=['High','Low'])
df
# 方法二:del,不过一次只能删除一列
del df['High']
del df['Low']
df
题30 对数据列重命名
某互联网公司股票数据,数据是 csv 格式,加载到 dataframe,重命名数据列:Date->D,Open->O,High->H,Low->L,Close->C,Volume->V
题解:
import pandas as pd
df=pd.read_csv('internet_company_stock_data.csv')
# 方法一:df.rename()
df=df.rename(columns={'Date':'D','Open':'O','High':'H','Low':'L','Close':'C','Volume':'V'})# 用字典形式一对一重命名
df
# 方法二:df.columns属性
df.columns=['D','O','H','L','C','V']
df
题31 加载电信客户流失数据集
目标:加载数据集到 pandas,查看数据集的前几行
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df.head()
题32 计算每一数据列的缺失值
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df.isnull().sum()
题33 正确设置数据列的类型
使用 df.info,会发现 TotalCharges 是 Object 类型,找出原因(查看分布),修正为 float 数字类型(中位数填充),查看新的数据分布
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df['TotalCharges'].value_counts() # 发现有空格统计出现了11次,导致类型为object
df_no_space=df[df['TotalCharges']!=' '] # 过滤掉空值
med=df_no_space['TotalCharges'].median() # 取到中位数
df.loc[df['TotalCharges']==' ','TotalCharges']=med # 用中位数代替空值
df['TotalCharges'].value_counts() # 确认空值不存在
df['TotalCharges']=df['TotalCharges'].astype(float) # astype修改Series类型
df.info() # 确认类型被修改为float
题34 将类别字段转换成 cat 类型
批量转换类型:tenure / MonthlyCharges / TotalCharges 转换成 float 类型,将其他列转换成 categorical 数据类型
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df_no_space=df[df['TotalCharges']!=' ']
med=df_no_space['TotalCharges'].median()
df.loc[df['TotalCharges']==' ','TotalCharges']=med
题解:
to_float=['tenure','MonthlyCharges','TotalCharges']
total=df.columns
to_cat=set(total)-set(to_float) # 取差集
for e1 in to_float:
df[e1]=df[e1].astype(float) # astype转换为float类型
for e2 in to_cat:
df[e2]=pd.Categorical(df[e2]) # Categorical转换为category类型
df.info() # 确认数据类型被修改
题35 对 cat 类型字段数据统计
只筛选出 Categorical 数据类型,实现描述性数据统计
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df_no_space=df[df['TotalCharges']!=' ']
med=df_no_space['TotalCharges'].median()
df.loc[df['TotalCharges']==' ','TotalCharges']=med
to_float=['tenure','MonthlyCharges','TotalCharges']
total=df.columns
to_cat=set(total)-set(to_float)
for e1 in to_float:
df[e1]=df[e1].astype(float)
for e2 in to_cat:
df[e2]=pd.Categorical(df[e2])
题解:
df.describe(include=['category']) # 输出结果的格式不同于小数类型的
题36 Churn 字段的数据分布
Churn表示客户是否流失,统计该字段的数据分布
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df['Churn'].value_counts() # 分类数据计数,数值数据排序
题37 多维度查看月费字段统计
维度:Churn 表示客户是否流失,PaymentMethod 表示支付方式
指标:MonthlyCharges 表示月费
题解:
df.groupby(by=['Churn','PaymentMethod'])['MonthlyCharges'].mean()
题38 Churn 字段的数据映射
Churn 表示客户是否流失,实现字符串到数字的映射,Yes->1,No->0
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
# 方法一:map、dictionary
dic={'Yes':1,'No':0}
df['Churn'].map(dic)
# 方法二:apply
def to_int(x):
if x=='Yes':
return 1
elif x=='No':
return 0
df['Churn'].apply(to_int)
题39 查看字段相关性矩阵
统计 dataframe 的相关性矩阵,查看字段之间的相关性
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df.corr() # 只会计算数据类型之间的相关性
题40 从数据集中采样数据行
采样10条数据,将结果存入 sample10.csv
题解:
import pandas as pd
df=pd.read_csv('Telco-Customer-Churn.csv')
df_sample10=df.sample(10)
df_sample10.to_csv('sample10.csv')
题41 合并两个 Series 生成一个 DateFrame
合并如下两个 Series 到 DateFrame,列名改为 col1、col2
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
题解:
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
df
题42 使用多个条件复杂筛选 DataFrame
筛选如下 DataFrame,条件为:col2>=0.0,col2<=1.0
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
import pandas as pd
df[(df['col2']>=0)&(df['col2']<=1)]
题43 根据现有列新增一个新的数据列
新增数据列 col3:如果 col2>=0,col3 是1;否则,col3 是 -1
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
import pandas as pd
# 方法一:apply
def new_list(x):
if x>=0:
return 1
else:
return -1
df['col3']=df['col2'].apply(new_list)
df
# 方法二:map
df['col3']=df['col2'].map(lambda x:1 if x>=0 else -1)
df
题44 根据现有列新增截数值数据列
新增数据列 col4:将 col2 截断到 [-1,1],即如果小于 -1,则等于 -1;如果大于1,则等于1
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
import pandas as pd
# 方法一:apply
def cut_number(x):
if x<-1:
return -1
elif x>1:
return 1
else:
return x
df['col4']=df['col2'].apply(cut_number)
df
# 方法二:clip
df['col4']=df['col2'].clip(-1,1)
df
题45 输出 dataframe 最大和最小的5个数字
输出col2:最大的5个数字
输出col2:最小的5个数字
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
df['col2'].nlargest(5)
df['col2'].nsmallest(5)
题46 输出 dataframe 数字的累计加和值
输出 col1:累积加和值
输出 col2:累积加和值
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
df['col1'].cumsum()
df['col2'].cumsum()
df.cumsum()
题47 计算 dataframe 某一列数字中位数
输出col2:中位数计算值
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
# 方法一:median
df['col2'].median()
# 方法二:quantile,默认q=0.5
df['col2'].quantile(q=0.5)
题48 按条件筛选 df 输出过滤后的结果
过滤出 col2 大于0的数据
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
# 方法一:df[cond]
df[df['col2']>=0]
# 方法二:loc[cond,:]
df.loc[df['col2']>=0,:]
# 方法三:query,类似sql写法
df.query('col2>=0')
题49 将 df 前几行转换成数据字典
取数据前5行,转换成字典形式
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
df_5=df.head()
df_5.to_dict()
题50 将 df 前几行转换成 html 格式
取数据前5行,转换成 html 格式
import pandas as pd
import numpy as np
np.random.seed(66)
s1=pd.Series(np.random.rand(20))
s2=pd.Series(np.random.randn(20))
df=pd.concat([s1,s2],axis=1)
df.columns=['col1','col2']
题解:
df_5=df.head()
df_5.to_html()
题51 按列名筛选 df 使用 .loc 方法进行
对如下 df,怎样用 df.loc 筛选数据,使得 C 数据列大于0.8
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
df.loc[df['C']>0.8]
题52 多条件组合筛选 dataframe
对如下 df,怎样筛选数据,使得 C 数据列大于0.3,D 数据列小于0.7
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
# 方法一:df[cond]
df[(df['C']>0.3)&(df['D']<0.7)]
# 方法二:loc[cond,:]
df.loc[(df['C']>0.3)&(df['D']<0.7),:]
# 方法三:query,类似sql写法
df.query('C>0 and D<0.7')
题53 怎样用 for 循环遍历 dataframe
对如下 df,使用 for 循环遍历前5行,打印每行的数
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
# 方法一:iterrows,返回 (index, Series) 元组
for ind,ser in df.iterrows():
print(ser)
# 方法二:loc根据索引取整行数
for i in df.index:
print(df.loc[i])
题54 指定单元格设置 DataFrame 的值
对如下 df,设置两个单元格的值:
使用 iloc,设定 (3,B) 的值是 NaN
使用 loc,设定 (8,D) 的值是 NaN
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
df.iloc[3,1]=np.nan
df.loc[8,'D']=np.nan
题55 移除 df 中数据值为空的行
对如下 df,移除包含 nan 的行,将结果赋值给 df2
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df.iloc[3,1]=np.nan
df.loc[8,'D']=np.nan
题解:
# 方法一:dropna
df.dropna(inplace=True)
df2=df
df2
# 方法二:iterows、drop
for ind,ser in df.iterrows():
if ser.isnull().any()==True:
df.drop(index=ind,inplace=True)
df2=df
df2
题56 重新设置索引列
移除列之后,index 缺少数字,怎样重置 index
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df.iloc[3,1]=np.nan
df.loc[8,'D']=np.nan
df.dropna(inplace=True)
题解:
df.reset_index(drop=True) # 重设索引列后,drop=True 将原索引列移除
题57 统计 df 每个数据列的缺失值个数
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df.iloc[3,1]=np.nan
df.loc[8,'D']=np.nan
题解:
df.isnull().sum()
题58 使用数字填充 df 缺失值
使用数字0,填充数据缺失值
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df.iloc[3,1]=np.nan
df.loc[8,'D']=np.nan
题解:
df.fillna(0)
题59 修改 df 数据列的前后顺序
怎样把列的顺序,变为 'D','A','B','C'
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
df=df[['D','A','B','C']] # 按顺序取出多列,再赋值给原 df
题60 删除 df 指定的数据列
怎样删除数据列D,或数据列C、D
import pandas as pd
import numpy as np
np.random.seed(66)
df=pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
题解:
df.drop(columns=['C'],inplace=True)
df.drop(columns=['C','D'],inplace=True)
题61 二手车-数据介绍和加载
使用 pandas 加载数据集
题解:
import pandas as pd
df=pd.read_csv('used_cars.csv',index_col=0)
题62 二手汽车-输出 df 标题名称列表
import pandas as pd
pd.read_csv('used_cars.csv',index_col=0)
题解:
df.columns
题63 两只股票-读取股票数据 csv
有两个 csv 文件,加载到 pandas,将日期作为索引列
题解:
import pandas as pd
pd.read_csv('stock.BIDU.csv',index_col='Date')
pd.read_csv('stock.IQ.csv',index_col='Date')
题64 两只股票数据-批量给列名加前缀
分别给来自 bidu 的所有列名加上 bidu_ 前缀,给来自 iq 的列名所有列名加上 iq_ 前缀
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
题解:
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
题65 两只股票-按日期关联两个 df
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
题解:
df12=pf.merge(bidu,iq,on=['Date'])
题66 两只股票-筛选所需要的列
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
df12=pf.merge(bidu,iq,on=['Date'])
题解:
df12[['bidu_open','bidu_close','iq_open','iq_close']]
题67 两只股票-计算每只股票当日涨跌幅
当日涨跌幅=(收盘价-开盘价)/ 开盘价
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
df12=pf.merge(bidu,iq,on=['Date'])
df12=df12[['bidu_open','bidu_close','iq_open','iq_close']]
题解:
df12['bidu_rate']=(df12['bidu_close']-df12['bidu_open'])/df12['bidu_open']*100
df12['iq_rate']=(df12['iq_close']-df12['iq_open'])/df12['iq_open']*100
题68 两只股票-计算同涨同跌的信号
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
df12=pf.merge(bidu,iq,on=['Date'])
df12=df12[['bidu_open','bidu_close','iq_open','iq_close']]
df12['bidu_rate']=(df12['bidu_close']-df12['bidu_open'])/df12['bidu_open']*100
df12['iq_rate']=(df12['iq_close']-df12['iq_open'])/df12['iq_open']*100
题解:
df12['plus']=df12['bidu_rate']*df12['iq_rate']
# 方法一:apply
def sign(x):
if x>0:
return 1
elif x<0:
return 0
df12['sign']=df12['plus'].apply(sign)
# 方法二:map
df12['sign']=df12['plus'].map(lambda x:1 if x>0 else 1)
题69 两只股票-计算同时涨跌的比例
import pandas as pd
bidu=pd.read_csv('stock.BIDU.csv',index_col='Date')
iq=pd.read_csv('stock.IQ.csv',index_col='Date')
bidu.columns=['bidu_'+col.lower() for col in bidu.columns]
iq.columns=['iq_'+col.lower() for col in iq.columns]
df12=pf.merge(bidu,iq,on=['Date'])
df12=df12[['bidu_open','bidu_close','iq_open','iq_close']]
df12['bidu_rate']=(df12['bidu_close']-df12['bidu_open'])/df12['bidu_open']*100
df12['iq_rate']=(df12['iq_close']-df12['iq_open'])/df12['iq_open']*100
df12['plus']=df12['bidu_rate']*df12['iq_rate']
df12['sign']=df12['plus'].map(lambda x:1 if x>0 else 1)
题解:
# 方法一:count
up=df12[df12['sign']==1].count()/df12['sign'].count()*100
down=df12[df12['sign']==0].count()/df12['sign'].count()*100
# 方法二:sum、len
up=df12['sign'].sum()/len(df12)*100
down=1-up
-END
https://www.bilibili.com/video/BV1Nq4y1Z7Q8?p=10&vd_source=efad7d657bca9605bbc1590a798ed819

浙公网安备 33010602011771号