使用 Python [pandas] 从 CSV 文件中聚合特定时期的数据

您好,
我是系统解决方案部门的川,我怀揣着远大的梦想,但性格比较软弱。

天气变得非常宜人,不是吗?
所以,这次我想使用 Python 的一个基础数据分析库“pandas”,
来汇总 CSV 文件中的大量数据。

环境

操作系统:Microsoft Windows 10 专业版;
Python 版本:3.10.4

大局

import pandas as pd from datetime import datetime as dt import collections import itertools df = pd.read_csv('<filename>.csv', usecols=['datetime', 'person_in_charge'], encoding='cp932' ) df_date = df.set_index('datetime') # 用于错误检查 def check(x): #print(x) pd.to_datetime(x) df_date.index.map(check) df_date.index=pd.to_datetime(df_date.index,format='%Y%m%d %H:%M') df_date.sort_index(inplace=True) df_date['count'] = 1 df_multi = df_date.set_index([df_date.index.year, df_date.index.month, df_date.index.weekday, df_date.index.hour, df_date.index]) df_multi.index.names = ['year', 'month', 'weekday', 'hour', 'date'] df_date['person_in_charge'] = df_date['person_in_charge'].str.split(',') all_tag_list = list(itertools.chain.from_iterable(df_date['person_in_charge'])) c = collections.Counter(itertools.chain.from_iterable(df_date['person_in_charge'])) tags = pd.Series(c) df_tag_list = [] top_tag_list = tags.sort_values(ascending=False).index[:11].tolist() for t in top_tag_list: df_tag = df_date[df_date['person_in_charge'].apply(lambda x: t in x)] df_tag_list.append(df_tag[['count']].resample('1M').sum()) df_tags = pd.concat(df_tag_list, axis=1) df_tags.columns = top_tag_list df_tags.to_csv('result.csv', encoding='cp932') print("完成")

目的和准备

原始 CSV 文件
包含大量数据,包括查询接收日期(yyyy/mm/dd 格式)和处理人员姓名。
作为预处理步骤,日期列命名为“datetime”,负责人列命名为“person_in_charge”。
由于我们将使用 pandas 库,因此通过 pip 安装需要
(对于其他环境,例如 Anaconda,请参考提供的链接。)

部分解释

▼ 使用 pandas 读取文件。csv 文件与代码文件位于同一文件夹中。

df = pd.read_csv('<filename>.csv', usecols=['datetime', 'person_in_charge'], encoding='cp932' )

▼ 使用 df.set_index 将“datetime”列指定为索引。
*后半部分用于检查是否存在空白单元格,因此可以省略。

df_date = df.set_index('datetime') def check(x): pd.to_datetime(x) df_date.index.map(check)

▼ 将数据类型转换为日期时间格式并排序

df_date.index=pd.to_datetime(df_date.index,format='%Y%m%d %H:%M') df_date.sort_index(inplace=True) #添加一个计数列用于重采样 df_date['count'] = 1

什么是重采样?(外部链接)

▼按日期或时间分组和计数

df_multi = df_date.set_index([df_date.index.year, df_date.index.month, df_date.index.weekday, df_date.index.hour, df_date.index]) df_multi.index.names = ['year', 'month', 'weekday', 'hour', 'date'] df_date['person_in_charge'] = df_date['person_in_charge'].str.split(',') all_tag_list = list(itertools.chain.from_iterable(df_date['person_in_charge'])) # 将迭代结果传递给集合。统计每个标签出现的次数 c = collections.Counter(itertools.chain.from_iterable(df_date['person_in_charge'])) # 转换为序列 tags = pd.Series(c)

pandas 中的序列是什么?(外部链接)

▼ 将标签存储在 DataFrame 中

df_tag_list = [] top_tag_list = tags.sort_values(ascending=False).index[:11].tolist()

▼ 这是关键点:
例如,通过将“df_tag_list.append(df_tag[['count']].resample('1M').sum())”中的“'1M'”部分更改为“'2W'”,您可以每两周进行一次聚合,或者如果您将其更改为“'7D'”,则可以每七天进行一次聚合。

for t in top_tag_list: df_tag = df_date[df_date['person_in_charge'].apply(lambda x: t in x)] df_tag_list.append(df_tag[['count']].resample('1M').sum()) df_tag_list = pd.concat(df_tag_list, axis=1) df_tags.columns = top_tag_list

▼ 将汇总数据输出到新文件

df_tags.to_csv('result.csv', encoding='cp932') #完成后,打印“done” print("done")

输出结果

以下是
按负责人划分的月度汇总数据。如有需要,您可以按周或按日汇总数据,
如果格式美观,还可以用作会议数据!

回头见!

如果您觉得这篇文章对您有帮助,请点个“赞”!
7
加载中...
7票,平均分:1.00/17
2,543
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

川健

来自系统解决方案部门的
一只奇特的宝可梦