1、对以下数据使用pandas进行数据提取或者数据筛选。df=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],"date":pd.date_range('20180101', periods=6), "city":['BeiJing', ' ShangHai ','GuangZhou ','ShenZhen ', ' NanJing','ChangZhou'],"age":[-18,20,-28,36,36,152],"category":['2018-A','2018-B' ,'2018-C','2018-D' ,'2018-E','2018-F'],"price":[1200 ,2500,5500,5500,4300,6200]}, columns =['id','date','city','age','category','price'])
(0)数据清洗,对city列中有空格的数据进行去除,对age中的异常值(年龄低于0)替换为当前列中的均值,对price列的数据转为小数格式。
清洗后的数据:
代码为:
import numpy as np
import pandas as pd
df['city'] = df['city'].str.strip()
df.loc[df['age']<0,['age']]=df['age'].mean()
df['price']=df['price'].astype(float)
print(df)
(1)取id、age两列的所有行数据(使用下标[]取值、loc方法取值、iloc方法取值实现)
结果如下图:
代码为:
print(df[['id','age']])
print(df.loc[:,['id','age']])
print(df.iloc[:,[0,3]])
(2)取出年龄在25到45范围的所有数据。
结果截图:
代码为:
print(df[(df['age'] < 45) & (df['age'] > 25)])
(3)取出年龄大于25,并且价格大于4000的id列数据
结果截图:
代码为:
print(df.loc[(df['age']>25)&(df['price']>4000),['id']])
(4)取出价格大于4000或者城市为“ShenZhen”的所有数据,并按照age列中年龄从大到小对所有数据进行排序。
排序后的数据结果:
代码为:
print(df[df['price']>4000].sort_values(['age'], ascending = False))
(5)对(4)题中排序的结果中的第一行行数据进行删除,并对最终结果的索引重置为0,1,2
代码为:
a.drop(a.index[0],inplace=True)
a=a.reset_index(drop=True)
print(a)
2、对以下pandas数据进行筛选或者汇总操作
df=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],"date":pd.date_range('20180101', periods=6),"city":['BeiJing', ' ShangHai ','GuangZhou ','ShenZhen ', ' NanJing','ChangZhou'],"age":[18,20,28,36,36,52],"category":['2018-A','2018-B' ,'2018-C','2018-D' ,'2018-E','2018-F'],"price":[1200 ,2500,5500,5500,4300,6200]})
(1)数据清洗,对city列中有空格的数据进行去除,并将该列的值转为全部小写。
清洗后的数据下图:
代码为:
import numpy as np
import pandas as pd
df['city']=df['city'].str.strip()
df['city']=df['city'].str.lower()
(2)数据预处理:将data列的日期类型分别按年、月、日进行拆分并在后面单独生成新的一列。如:拆分年(2018)为单独一列,月(01)为单独一列,日(01)为单独一列。
拆分的结果图如下:
代码:
new_data = pd.to_datetime(df['date'], format="%y-%m-%d")
df.insert(6, 'day', new_data.dt.day)
df.insert(6, 'month', new_data.dt.month)
df.insert(6, 'year', new_data.dt.year)
(3)增加一列level,该对age列的数据进行描述,假如年龄大于25则填充为’old’,小于等于25则为‘young’。
代码为:
df.insert(9,'level',0)
df.loc[df['age']>25,['level']]='old'
df.loc[df['age']<=25,['level']]='young'
(4)按age列对所有行数据进行分组并对每个分组进行计数汇总。
代码为:
print(df.loc[:,['age']].value_counts(sort=False))
(5)按age列对所有行数据进行分组并求不同年龄的price列的总价格和平均价格
代码为:
print(df.groupby('age')['price'].agg([np.sum,np.mean]))
3、读取文件“淘宝某商品所搜结果的数据——原数据.csv”,对该文件进行数据清洗及清洗后的文件保存。该数据表为:
(1)读取文件“淘宝某商品所搜结果的数据——原数据.csv”,使用dataframe对象进行数据封装,并打印该dataframe对象,以及整体的数据描述。
代码为:
import pandas as pd
df=pd.read_csv("D:\subject\大数据\实验报告\实验10-数值分析基础-pandas(2)\淘宝某商品所搜结果的数据——原数据.csv",sep=" ")
df1=df.copy()
print(df)
(2)按以下打印的结果对df的行列数据进行存在空值和全为空值的统计。
代码为:
h1=df.isnull().any(axis=1).sum()
l1=df.isnull().all(axis=0).sum()
l2=df.isnull().any(axis=0).sum()
h2=df.isnull().all(axis=1).sum()
print("统计数据表中有%d行存在空值,以及%d列数据全为空值" %(h1,l1))
print("统计数据表中有%d列存在空值,以及%d行数据全为空值" %(l2,h2))
(3)删除数据表中有两个及其以上空值的数据
删除后的截图:
代码为:
df.dropna(axis=0,thresh=2,inplace=True,how='any')
(4)对评论数列的空值填充为0,并评论数列的类型转为整数型。对价格列中的空值填充为该列的平均值。
结果截图:
代码为:
df['评论数']=df['评论数'].fillna(value=0)
df['评论数']=df['评论数'].astype('int')
df['价格']=df['价格'].fillna(value=df['价格'].mean())
print(df)
(5)对店铺名称列内容去除空格,并对有字母开头的内容,要求首字母大写。
结果截图:
代码为:
df['店铺名称']=df['店铺名称'].str.strip()
df['店铺名称']=df['店铺名称'].str.title()
print(df)
(6)将地址列的数据分别按省、市进行拆分(原数据的省市是字符串类型并用空格隔开)并在后面单独生成新的一列。
拆分的结果图如下:
代码为:
df['省'],df['市']=df['地址'].str.split(" ",expand=True).values.T
print(df)
(7)对付款人数列中的内容截取数字开始的数值,并对该列进行修改,将该列的类型改为整数型。
结果截图:
代码为:
df['付款人数']=df['付款人数'].str.extract('(\d+)')
print(df)
(7)对数据表按照付款人的从高到低的顺序进行排序。
排序结果截图:
代码为:
df['付款人数']=df['付款人数'].astype('int')
print(df.sort_values(by=['付款人数'],ascending = False))
(8)对排序后结果的索引删除,并重置索引从0开始
结果截图:
代码为:
df=df.sort_values(by=['付款人数'],ascending = False)
print(df.reset_index(drop=True))
(9)对数据清洗后的数据表格进行保存
代请指正