日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

早起導讀:pandas是Python數據處理的利器,如果每天都要使用pandas執行同樣的操作,如何制作一個有界面的軟件更高效的完成?本文提供了一種基于PyQt5的實現思路。

關鍵詞:pandas PyQt5?數據透視?文件合并

前言

由于在工作中需要處理很多日志文件數據,這些數據并不存在于數據庫,而是以每日1個單文件的形式存在,為了讓我們在日常數據處理中更方便的進行一些基礎的數據合并、清洗篩選以及簡單的分組或數據透視處理,結合PyQt5與pandas庫,制作了一個簡單的數據處理可視化工具。

執行效果

我們運行腳本打包后的 exe 可執行文件,設定相關參數后點擊“數據處理并導出”即可等待處理~

以下是29文件共1400余萬行數據的處理結果,差不多用了10分鐘合并并處理導出所需結果~

1.窗體可視化設計

采用PyQt5進行可視化界面設計,具體設計過程可以直接在QT designer中進行操作,然后轉化為可視化界面的py文件。

界面效果如下圖:

對于我們的操作界面,支持以下功能:

  • 選擇原始數據所在的文件夾
  • 選擇需要vlookup的文件所在的文件夾
  • 選擇處理后結果導出的文件夾
  • 輸入結果導出的文件名
  • 在原始數據中用于過濾篩選的字段
  • 在原始數據中用于過濾篩選的條件
  • 如果做數據透視的行(index)
  • 數據透視的列(column)
  • 用于計算的字段
  • 用于計算的方法

2.多文件合并(concat)

由于我們拿到的原始數據是以日期為文件名的csv文件,如果需要處理多天的數據,需要進行簡單的數據合并后再做相關數據處理操作。

這一步其實有4個操作:①獲取文件夾下的文件列表 ②根據文件類型進行文件讀取 ③對讀取的文件進行簡單的數據清洗 ④合并清洗后的數據

2.1.獲取文件夾下的文件列表

獲取文件夾下文件列表可以使用os.walk方法,產生3-元組 (dirpath, dirnames, filenames)【文件夾路徑, 文件夾名字, 文件名】。

根據文件夾路徑+文件名即可組成改文件的絕對路徑,用于后續文件讀取。

In??[1]:?import?os
????...:?
????...:?location?=?r'F:\數據處理工具\測試數據'
????...:?filenames?=?os.walk(location)
????...:?
????...:?#獲取文件夾下全部文件的絕對路徑
????...:?for?fileName?in?os.walk(location):
????...:?????for?table?in?fileName[2]:
????...:?????????path?=?fileName[0]?+?'\\'?+?table
????...:?????????print(path)
F:\數據處理工具\測試數據\1.csv
F:\數據處理工具\測試數據\2.csv
F:\數據處理工具\測試數據\3.csv
F:\數據處理工具\測試數據\4.csv
F:\數據處理工具\測試數據\5.csv
F:\數據處理工具\測試數據\6.csv
F:\數據處理工具\測試數據\7.csv
F:\數據處理工具\測試數據\8.csv
F:\數據處理工具\測試數據\9.csv

2.2.根據文件類型進行文件讀取

由于在實際操作過程中,可能存在原始文件是csv壓縮包zip格式,或者xlsx格式。我們需要根據文件名后綴進行判斷,然后選擇對應的讀取文件數據方法。

采用os.path.splitext(“文件路徑”) 分離文件名與擴展名,默認返回(fname,fextension)元組。

這里我們只考慮兩種情況:csv(含zip)以及xlsx(含xls):

if?filetype?==?'.csv'or?filetype?==?'.zip':
????Li?=?pd.read_csv(path,?header=0)????????????????????????
elif?filetype?==?'.xlsx'?or?filetype?==?'.xls':
????Li?=?pd.read_excel(path,?header=0)
else:
????log?=?''
????print(log)

2.3.對讀取的文件夾下簡單的數據清洗

對于讀取的文件數據,并不是所有的數據都是我們需要用到的,或者說我們需要用到的數據可能是需要滿足指定條件的。

比如對于下面這個情況,讀取 9.csv 文件后,我們看到 usernum 每個值出現的次數,然后我希望取滿足uesrnum為10的數據。

In?[2]:?df?=?pd.read_csv(r'F:\數據處理工具\測試數據\9.csv')
In?[3]:?df.groupby('usernum').count()
Out[3]:?
?????????@timestamp???appid??...??truedmgtohero??victory
usernum??????????????????????...????????????????????????
1????????????516999??516999??...?????????516999???516999
2?????????????33970???33970??...??????????33970????33970
3?????????????36819???36819??...??????????36819????36819
4??????????????6917????6917??...???????????6917?????6917
5??????????????7855????7855??...???????????7855?????7855
6?????????????15416???15416??...??????????15416????15416
8??????????????1220????1220??...???????????1220?????1220
10????????????75420???75420??...??????????75420????75420

[8?rows?x?71?columns]

我們用到布爾索引即可df[df['usernum']==10]

In?[4]:?df_10?=?df[df['usernum']==10]
In?[5]:?df_10.groupby('usernum').count()
Out[5]:?
?????????@timestamp??appid??...??truedmgtohero??victory
usernum?????????????????????...????????????????????????
10????????????75420??75420??...??????????75420????75420

[1?rows?x?71?columns]

但是,因為我們的篩選字段及條件都是通過可視化操作界面進行輸入的,輸入的數據類型在程序中是字符串,所以我們需要將其處理成為可以用于條件篩選的形式。而且,我們在進行清洗的時候字段及條件可能是多個的。

比如我輸入的字段為:usernum/victory;輸入的條件為:>=6/==1。

那我們實際上需要進行的清洗過程是df = df[df['usernum']>=6] 和 df = df[df['victory']==1],為實現這個效果,可以用最簡單的字符拼接的形式 s = f"Li['{checkli[0]}']{conditionli[0]}",然后進行eval(s)轉化。

#獲取輸入的篩選字段(用‘/’分割),我們用'/'拆分為列表
checkli?=?self.lineEditcheck.text().split('/')
#獲取輸入的條件參數(用‘/’分割),我們用'/'拆分為列表
conditionli?=?self.lineEditcondition.text().split('/')
for?inum?in?range(len(checkli)):
????s?=?f"Li['{checkli[0]}']{conditionli[0]}"
????Li?=?Li[eval(s)]

關于數據清洗處理,我們會在pandas學習筆記中進行詳細介紹~

2.4.合并清洗后的數據

這一步就比較簡單了,直接將需要合并的數據添加的列表中,然后concat合并即可。不過,需要做個簡單的判斷,如果原始只有1個文件,直接就取改文件即可;超過1個文件情況下,才需要執行合并操作。

????#...讀取并清洗數據...
????fileList.append(Li)

if?len(fileList)>1:
????data_result?=?pd.concat(fileList,?ignore_index=True)
else:
????data_result?=?fileList[0]

3.多文件拼接(merge)

這個其實也比較簡單,我們事先把需要用于橫向拼接的文件放到指定目錄后,讀取文件列表逐一和第2節中的處理過的原始數據進行merge處理。

基于第2節中介紹過的文件夾下文件列表讀取,這里只介紹merge處理。

還是一樣的邏輯,先判斷是否有需要merge的文件,然后再執行后續操作,我們需要用到左連接方式處理。

????#...讀取需要用于merge的文件組合成列表...
????fileList.append(Li)
for?i?in?range(0,len(fileList)):
????data?=?pd.merge(data,fileList[i],how?=?'left')

4.數據處理(pivot_table和groupby)

數據處理中我們可以用到pivot_table方法或者數據透視分組統計groupby方法,具體根據自己的需求選擇。

這一部分我們在后續 pandas學習筆記中也會詳細介紹~

4.1.數據透視(pivot_table)

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)

以下舉例,簡單介紹下其使用方式

In??[6]:?df?=?pd.DataFrame({"A":?["foo",?"foo",?"foo",?"foo",?"foo",
????...:??????????????????????????"bar",?"bar",?"bar",?"bar"],
????...:????????????????????"B":?["one",?"one",?"one",?"two",?"two",
????...:??????????????????????????"one",?"one",?"two",?"two"],
????...:????????????????????"C":?["small",?"large",?"large",?"small",
????...:??????????????????????????"small",?"large",?"small",?"small","large"],
????...:????????????????????"D":?[1,?2,?2,?3,?3,?4,?5,?6,?7],
????...:????????????????????"E":?[2,?4,?5,?5,?6,?6,?8,?9,?9]})
In?[7]:?df
Out[7]:?
?????A????B??????C??D??E
0??foo??one??small??1??2
1??foo??one??large??2??4
2??foo??one??large??2??5
3??foo??two??small??3??5
4??foo??two??small??3??6
5??bar??one??large??4??6
6??bar??one??small??5??8
7??bar??two??small??6??9
8??bar??two??large??7??9

#?values是需要用于計算的字段,index是索引,columns是列,aggfunc是統計方式
In??[8]:?table?=?pd.pivot_table(df,?values='D',?index=['A',?'B'],
????...:?????????????????????columns=['C'],?aggfunc='sum')
In?[9]:?table
Out[9]:?
C????????large??small
A???B????????????????
bar?one????4.0????5.0
????two????7.0????6.0
foo?one????4.0????1.0
????two????NaN????6.0

#如果aggfunc指定了多個統計方式,其會對計算的字段values中每個字段進行多個統計計算
In?[10]:?table?=?pd.pivot_table(df,?values=['D',?'E'],?index=['A',?'C'],
????...:?????????????????????aggfunc={'mean','sum'})
In?[11]:?table
Out[11]:?
??????????????????D???????????????E??????
???????????????mean???sum??????mean???sum
A???C????????????????????????????????????
bar?large??5.500000??11.0??7.500000??15.0
????small??5.500000??11.0??8.500000??17.0
foo?large??2.000000???4.0??4.500000???9.0
????small??2.333333???7.0??4.333333??13.0

#我們可以通過給aggfunc傳遞字典的形式指定每個用于計算字段的統計方式,這也是我們本次需要用到的
In?[12]:?table?=?pd.pivot_table(df,?values=['D',?'E'],?index=['A',?'C'],
????...:?????????????????????aggfunc={'D':?'mean','E':?'sum'})
In?[12]:?table
Out[12]:?
??????????????????D???E
A???C??????????????????
bar?large??5.500000??15
????small??5.500000??17
foo?large??2.000000???9
????small??2.333333??13

4.2.分組統計(groupby)

DataFrame.groupby([]).agg(dict)

分組統計是pandas很大的模塊,這里也不做過多的介紹,大家可以關注后續 pandas學習筆記系列。

簡單舉個例子:

In?[13]:?df
Out[13]:?
?????A????B??????C??D??E
0??foo??one??small??1??2
1??foo??one??large??2??4
2??foo??one??large??2??5
3??foo??two??small??3??5
4??foo??two??small??3??6
5??bar??one??large??4??6
6??bar??one??small??5??8
7??bar??two??small??6??9
8??bar??two??large??7??9

In?[14]:?df.groupby('A')['D'].mean()
Out[14]:?
A
bar????5.5
foo????2.2
Name:?D,?dtype:?float64

#agg傳字段參數更合適,可以和pivot_table統一化
In?[15]:?df.groupby(['A']).agg({'D':'mean','E':'sum'})
Out[15]:?
???????D???E
A???????????
bar??5.5??32
foo??2.2??22

4.3.數據處理函數

由于行列以及計算字段和方法都是在可視化操作界面輸入,我們需要對獲取參數后進行字符串有關處理,從而組合成為最終的計算方式。

#獲取輸入的行、列、計算字段和方法
hang?=?self.lineEditHang.text().split(',')
lie?=?self.lineEditLie.text().split(',')?if?len(self.lineEditLie.text())!=0?else?[]
ziduan?=?self.lineEditJisuan.text().split(',')
fangfa?=?self.lineEditJisF.text().split(',')

將計算字段和計算方法進行組合成為字典

dic?=?{}
for?i?in?range(len(fangfa)):
????#需要注意,這里對于非重復計數,其組合形式有點特別,不能用引號
???????if?fangfa[i]?==?'pd.Series.nunique':
????????dic[ziduan[i]]?=?eval(fangfa[i])
???????else:
???????????dic[ziduan[i]]?=?fangfa[i]??

判斷在可視化操作界面是否選中了數據透視操作,然后執行數據處理

if?self.radioButton_toushi.isChecked():
????result?=?pd.pivot_table(df,?values=ziduan,
??????????????????aggfunc=dic,?
??????????????????columns=lie,
??????????????????index=hang,
??????????????????).reset_index()
else:
????result?=?df.groupby(hang).agg(dic).reset_index()??

5.總結

以上主要三部分:

  • 先創建好可視化操作界面,
  • 然后編寫功能槽函數和可視化操作界面功能進行關聯,
  • 最后就是打包源代碼成可執行文件exe。

在進行每一步的操作時,最好都能加上邊界條件處理,避免出現異常報錯導致程序崩潰的情況。

每個槽函數其實都是利用到的python基礎知識或者pandas基礎數據處理知識,熟練掌握后便可很方便理解和實現。

:后臺回復「0906」獲取本文涉及的完整源碼!

-END-

總結

以上是生活随笔為你收集整理的pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。