「Python」Pandas-DataFrame的相关操作二
如果这篇文章没有找到你想要的数据操作,请光顾我的上一篇文章哦
「Python」Pandas-DataFrame的相关操作一
话不多说,直接实战吧~
合并为一列并重置索引
需求:初始值有三列且每一列的数量均不相同,需要将三列合并为一列
实现效果如下:
主要是使用了melt
函数,它将所有列变成行(显示为列变量)并在新列值中列出所有关联值。实现功能如下:
所以即使对于不同列的数量不相同的情况也可以合并为新的一列,对于空值,只需要.dropna()
。
实现代码:
df.melt().dropna().reset_index(drop=True) # dropna()是为了解决三列的长短不一的情况,即有些列10行,有些列8行,需要除去空值。
为不同的列指定标签
案例一
需求:将高级、中级、低级管理者分别添加对应的类别标签,即1-2-3。
实现效果:
使用df['variable'].unique().tolist()
就可以获取variable
列出现过的值,通过list.index()
方法就可以获取对应值的下标,即可能的下标值为0、1、2,就刚好和我们要的标签对应起来了。结合.apply
方法,添加新列group
即可。
实现代码:
# admin_dict = ['高级管理者', '中级管理者', '初级管理者'] # df['variable'].unique().tolist() # 转化为列表 df['variable'].apply(lambda x : (admin_dict.index(x) + 1) )
index(x) + 1实际上就是把他变为1-2-3,默认是从0开始。
案例二
需求:将甲、乙、丙三种种子的类别标签添加到对应的数据中去。
即需要产量数据和类别标签两列数据。且对应的数据需要对应相应的类别。不妨将甲、乙、丙变为0-1-2。
原始数据:
实现效果:
先通过.stack()
将所有的数据变为一列,再考虑如何添加对应标签的问题。
.reset_index(level=0)
即去除掉第一个索引(unnamed...),保留原来的(0,1,2)索引。
reset_index(drop=True)
是新的dataframe的索引重新排列为有序的。
代码实现:
先通过.stack()将所有的数据变为一列,再考虑如何添加对应标签的问题。 .reset_index(level=0)即去除掉第一个索引(unnamed...),保留原来的(0,1,2)索引。 reset_index(drop=True)是新的dataframe的索引重新排列为有序的。 代码实现: 作者:xincheng_q 链接:https://juejin.cn/post/7151968544933019656 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果想要将group
列的值替换成甲、乙、丙的话,需要用到.apply
方法,和案例一中的相似,这里不具体实现了。
案例三
需求:将含有两个标签的表格数据变为列数据,且index设置为对应的标签。(复合标签,如:(B1,A1))
原始数据:
实现效果:
仍然通过.stack()
方法将数据展开成为一列,和前面一样,需要注意的是这里还使用了.astype()
方法,将某一列的值全部变为同一类型,方便运算。
代码实现:
goods.stack().reset_index().rename(columns={0:'value'}) goods['value'] = goods['value'].astype(int) # astype(int):将某一列的值的类型变为int
统计一行的平均值并作为新的一列
需求:统一某一行的平均值并把它作为新的一列加在原始数据中。
计算平均值
方法一:
df5.iloc[:,1:].mean(axis=1) # 直接算均值
方法二:
df['Col_sum'] = df.apply(lambda x: x.sum() / len(x), axis=1) # 可以适当变化取需要的列并求平均值 # df['col_sum'] = df.iloc[,1:].apply(lambda x : x.sum() / len(x), axis = 1)
方法三:
# 计算每列的平均值并作为新的行 df.loc['Row_sum'] = df.apply(lambda x: x.sum())
根据已有列进行运算得到新的列
需求:根据已有列,拓展已有列的数值运算列。
原始数据:
实现效果:
代码实现:
# 方法一: df3['p0q0'] = [df3.iloc[i,0] * df3.iloc[i,2] for i in range(len(df3))] df3['p1q0'] = [df3.iloc[i,0] * df3.iloc[i,3] for i in range(len(df3))] df3['p0q1'] = [df3.iloc[i,1] * df3.iloc[i,2] for i in range(len(df3))] df3['p1q1'] = [df3.iloc[i,1] * df3.iloc[i,3] for i in range(len(df3))]
# 方法二: [p1 * q1 for p1, q1 in zip(df7['Dollars']['1'],df7['Units']['1'])]
# 对某一列求和 sum(df3['p0q1'])
查找某一列超过一定数值
需求:DataFrame数据中查找某一列的数据大于某个值
代码实现:
data[data['月消费支出额(元)'] >= 600]
直接嵌套即可,有种套娃的感觉(bushi
pivot_table
需求:汇总人员的销售产品数量和收入总额
原始数据:
汇总不同销售人员的销售总额:
展示一个销售人员销售不同商品的数量:
主要用到pivot_table的aggfunc
,聚合函数。
代码实现:
df.pivot_table(index='Name',values=['Dollars'],aggfunc=['count',np.sum]) # index:索引列 values:值 # aggfunc:聚合函数(可以有多个) # margins=True汇总
# 汇总每位销售人员销售每种产品的数量与销售额 df.pivot_table(index='Name',values=['Dollars'],columns=['Product'],aggfunc=['count',np.sum],margins=True)
绘图按照值从低到高排序
实现效果:
考查.sort_values()
方法,参数by
指定按照什么值排序,ascending
为False时,从大到小排,反之,为从小到大排。
代码实现:
dft.sort_values(by=['含量'],ascending=False).plot(kind='bar')
柱状图不同类型不同颜色
需求:同一个柱状图中不同类型显示的颜色不同
实现效果:
通过dataframe.plot()
指定color
参数为plt.cm.Paired()
即可实现同一个柱形图不同种类的颜色不同。
代码实现:
plt.bar(range(len(df3)), df3['次数'], color=plt.cm.Paired(np.arange(len(df3)))) xlabel = ['日常', '约会', 'party聚会', '旅行', '商务', '运动', '情趣', '其它'] plt.xticks(range(len(xlabel)),xlabel) # 设置标签
按照月份统计
需求:实现按月份统计销售量
原始数据:
实现效果:
代码实现
初步想法:
# Date:2013-01-01 ~ 2016-01-01 cakes.groupby(cakes['Date'].apply(lambda x:x.month)).sum()
上述代码统计的是所有年份的1月,效果如下:
我们需要实现的目标是:每一年的月份分别统计。所以可以想想用groupby
先分组,按照月份分组,就可以实现想要的效果了!
代码如下:
cakes.groupby(cakes['Date'].apply(lambda x:x.strftime('%Y/%m'))).sum() # 每年每个月份分别求和 # df['日期'].apply(lambda x:x.strftime('%Y/%m')) # 将日期格式设置为年月 # df.groupby(df['日期'].apply(lambda x:x.strftime('%Y/%m'))) # 按照年月groupby
上面还设置到了DataFrame中设置日期格式的函数strftime()
这次关于DataFrame的相关操作就分享到这儿了,等遇到实际的题再更后续吧。