数据挖掘算法和实践(二十六):DataFrame的常用方法温故
发布时间
阅读量:
阅读量
最近在学习使用Pandas进行数据分析时遇到了一些疑惑和问题,主要集中在以下几个方面:如何高效地导入和导出DataFrame格式的数据;如何将不同类型的Python数据(如list、字典等)转换为DataFrame;如何利用DataFrame的索引来进行切片和定位;如何对DataFrame应用自定义函数(如apply和lambda函数)进行数据处理;如何对数据进行排序和调整列的顺序;以及如何进行初级统计汇总(如求均值、总和等)。此外,在处理缺失值时也遇到了一些挑战,并学习了如何使用fillna方法填补缺失值以及如何利用groupby方法对数据进行分组聚合操作。通过这些实践逐步掌握了Pandas的核心功能,并对后续的数据分析工作充满信心。
在开发一个分类模型的过程中发现对dataframe的操作尚有不足之处。
为了更好地梳理思路与解决问题,特意整理了本次实践中的疑虑与困惑。
数据的导入和写出
# 数据的导入和写出,pandas包可以读取excel、csv、json等文件格式
data1=pd.read_excel(baseUrl+"data1.xlsx")
# 相应地,pandas结构化的数据也可以写出本地的任意格式
submission = pd.DataFrame({
"dddd": y["dddd"],
"tttt": y['tttt'].apply(lambda x:1 if x>0.5 else 0)
})
submission.to_csv('result.csv', index=False)
其他数据类型转DataFrame
# 从python的list创建
a=[[1,2,3],[2,3,4],[3,4,5]]
dfa=pd.DataFrame(a,columns=['a','b','c'])
# 字典创建
data = {
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame = pd.DataFrame(data)
# np创建
s=(3,4)
frame = pd.DataFrame(np.zeros(s))
df = pd.DataFrame(np.random.randn(3,4))
# 强制类型转换
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df[['two', 'three']] = df[['two', 'three']].astype(float)
df.dtypes
# 算术运算
df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns = list('bde'),index=['Utah','Ohio','Texas','Oregon'])
df1 + df2
索引和切片
# 索引和切片,loc和iloc的区别在于后者是范围切片,前者是用idex+column组合切片,ix则都可以,三者都是先行后列
print data.columns #列索引名称
print data.index #行索引名称
print data.ix[1] #取第2行数据
print data.iloc[1] #取第2行数据
print data['x'] #取列索引为x的一列数据
print data.loc['A'] #取行索引为”A“的一行数据,
print data.loc[:,['a','b'] ] #表示选取所有的行以及columns为a,b的列;
print data.loc[['A','B'],['x','z']] #表示选取'A'和'B'这两行以及columns为x,z的列的并集;
print data.iloc[1:3,1:3] #数据切片操作,切连续的数据块
print data.iloc[[0,2],[1,2]] #即可以自由选取行位置,和列位置对应的数据,切零散的数据块
print data[data>2] #表示选取数据集中大于0的数据
print data[data.x>5] #表示选取数据集中x这一列大于5的所有的行
print a1[a1['y'].isin(['6','10'])] #表显示满足条件:列y中的值包含'6','8'的所有行。
print data.mean() #默认对每一列的数据求平均值;若加上参数a.mean(1)则对每一行求平均值;
print data['x'].value_counts() #统计某一列x中各个值出现的次数:
print data.describe() #对每一列数据进行统计,包括计数,均值,std,各个分位数等。
应用该方法时会调用[lambda]()函数
# DataFrame中map、apply、applymap
# 三者都可以使用自定义函数或者lambda表达式,区别在于map是py自带,apply是适用某一行或者列,applymap适用整个df
a=[[1,2,3],[2,3,4],[3,4,5]]
df1=pd.DataFrame(a,columns=['a','b','c'])
df1['d']=df1['c'].apply(lambda x:x-1)
df1['e']=df1['c'].map(lambda x:x-1)
df2=df1.applymap(lambda x:x-1)
print('df1:',df1)
print('df2:',df2)
排序和调整顺序
# 排序及调整列的顺序
a=[[6,12,3],[8,4,1],[7,4,5]]
df1=pd.DataFrame(a,columns=['a','b','c'])
#按照任意一列或多列进行排序
df2=df1.sort_values(by=['a'])
初级汇总
# 初级统计汇总
a=[[6,12,3],[8,4,1],[7,4,5]]
df1=pd.DataFrame(a,columns=['a','b','c'])
df1.sum(axis=1)# 列汇总
df1.sum() #行汇总
df1.mean() # 行平均
df1.mean(axis=1,skipna=False) # 列平均
df1.describe() # 列统计分析
空值填充
# 空值填充Pandas中缺失值相关的方法主要有以下三个:
#isnull和isna方法用于判断数据是否为空数据,因为对R语言的模仿,两者无差异,np用的是isnan()
#fillna方法用于填补缺失数据;fillna识别的空值是NaN和None,但不包括空字符串
#dropna方法用于舍弃缺失数据。
a=[['','w','c'],['b','k','m'],['ss','s','v']]
df1=pd.DataFrame(a,columns=['a','b','c'])
df1['a'].isnull() #等价 df1['a'].isna()
# 可以将空格和空值转成NaN后再处理
df1['a']=df1['a'].apply(lambda x: np.NaN if str(x).isspace() or str(x)=='' else x)
df1.isnull()
df1.fillna('fuck')

groupby的使用
# groupby的使用
df = pd.DataFrame({'Gender' : ['男', '女', '男', '男', '男', '男', '女', '女', '女'],
'name' : ['周杰伦', '蔡依林', '林俊杰', '周杰伦', '林俊杰', '周杰伦', '田馥甄', '蔡依林', '田馥甄'],
'income' : [4.5, 2.9, 3.8, 3.7, 4.0, 4.1, 1.9, 4.1, 3.2],
'expenditure' : [1.5, 1.9, 2.8, 1.7, 4.1, 2.5, 1.1, 3.4, 1.2]
})
#根据其中一列分组,as_index=False 解决视图问题
mean1 = df.groupby(['Gender'], as_index=False).mean()
#根据其中两列分组
mean2 = df.groupby(['Gender', 'name'], as_index=False).mean()
#只对其中一列求均值
mean3 = df.groupby(['Gender', 'name'], as_index=False)['income'].mean()
# df_index = df.reset_index()
mean1,mean2,mean3
#size跟count的区别: size计数时包含NaN值,而count不包含NaN值
size = df.groupby(['Gender'], as_index=False).size()
count = df.groupby(['Gender', 'name'], as_index=False).count()
data_group = df.groupby(by=['Gender'])
data_group['name'].count() # 等价于mean2 = df.groupby(['Gender'], as_index=False).count()
#groupby+agg 可以对groupby的结果同时应用多个函数
df.groupby(['Gender', 'name'], as_index=False).agg(['min','max'])

OneHot处理
# 数据的onehot处理
dummies_1 = pd.get_dummies(df['name'])
dummies_1.columns = ['tfz','cyl','zjl','ljj']
#df = df.join(dummies_1)
全部评论 (0)
还没有任何评论哟~
