利用pandas对多个相同字段的CSV进行汇总

很奇妙,我不知道这一篇标题该叫啥,这标题也不知对不对,不过不能添加标签,顾及别人也看不到,自己能看懂,无所谓了;那我就说说遇到了什么问题,然后怎么解决的吧

当牵扯到随机的时候,为了验证精度啊之类的,常常需要做很多次,然后求平均啥的,很简单,会点鼠标的都能做,但是当文件上百的时候,就有点难度了。

我的每个文件大概长这样,我需要做的呢,对B排序,按排序结果赋权值,按A属性对所有文件的权值结果求和、求平均之类的,

手操并不难,也就是把两个文件里面的B11对应的C加一下……B12对应的C加一下……

但我有几百个这样的文件,我可能需要一个不辞辛苦的会计,pandas帮我解决了问题

原文件1                                          原文件2                                         手动排序赋权值

然后加合,我懒,所以这里没有加和结果图

 

我的代码长这样:

import os
import pandas as pd
#创建全局可操作变量
df = pd.DataFrame(data=None,columns=['Property','0','score'])
#于是我们有了一个只有表头的可操作CSV,接下来把需要操作的文件读进来
allfiles = os.listdir('C:\\Users\\mrlon\\Desktop\\paixu')#获取每个文件名
print(allfiles)
#然后就是循环操作的事儿了
for eachfile in allfiles:#对每个文件
  inpath = 'C:\\Users\\mrlon\\Desktop\\paixu'+'\\'+eachfile#输入路径
  df1 = pd.read_csv(inpath,usecols=[0,1])#打开文件,我后面还有其他玩意儿,只读前两列
  #skipnrows(跳过某些行)和nrows(读取某些行)可以控制行
  df1 = df1.sort_values(by='0',ascending=False)#按‘0’那一列的值,降序排列
  df1 = df1.iloc[:10]#保留前10行,从结果来看,iloc这个函数默认不算表头
  df1['score']=[10,9,8,7,6,5,4,3,2,1]#添加我的权值
  frames=[df,df1]#合并,相同的表头,只保留数据
  df=pd.concat(frames)#覆写,把我得到的结果放在全局变量里面
  del df1#删除,不加也行,反正下一个循环df1会被覆盖
#最后就是分组求和的事情了,按Property分组,对‘0’,‘score’求和
df = df.groupby('Property',sort=False,as_index=False)\
.agg(Property=('Property','first'),Value=('0', 'sum'),score=('score','sum'))
#'\'一行太长,不好看,'\'用来换行,drop_duplicates()删除重复项,groupby分组,agg融合
#agg的参数很,很……很随意吧……这里相当于定义了三个新列覆写了原数据,
#Property=('Property','first'),等号左侧是新列名,右侧第一个是运算列,第二个是运算形式
df = df.sort_values(by='score',ascending=False)#降序排列一下
print(df)#输出,是的,我不需要保存

我的输出结果长这样,当然,这里数据不全:

 使用pandas对具有条件的重复行求和

这是对我帮助比较大的文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值