I have generated a csv using a data response from an API call and it is as follow: enter image description here

总共有25LOC_CODE个,这意味着地点. 总共有6ITEM_CODE个,与二氧化Carbon 水平、CO水平等相对应.(稍后我将把数字代码映射到Word,但这不是这里的问题.)

Item_Codes为:1、3、5、6、8和9

问题是: 我想对这个数据集进行排序并覆盖相同的CSV,以便只有25行,其中每行都是唯一的位置LOC_CODE. 我希望显示每个位置的所有六个Item_Codes的值,这样就不会像屏幕截图中那样每行显示一个item_code.其他一切都保持不变.我只想在单行上显示唯一位置的所有六个ITEM_CODE的值.

我一直在研究使用PANDA将行转换为列的方法,但所有方法都只是针对字段名这样做.

The expected output should format as follow: (ignore REGIST_DT, the Date time are from 'DATA_DT') enter image description here

推荐答案

此解决方案假设来自API的响应已经保存到CSV文件中,格式如第一个截图所示.我用的是csv模块中的csv.DictReadercsv.DictWriter.

在开始之前,我们先使用以下命令导入csv:

import csv

让我们首先创建一个函数,将DATA_DT处理成所需的格式

def get_datetime(value: str):
    # returns year, month, day, time (hh:mm:ss), in that order
    # assumes string length is 14 and has format 'YYYYMMDDhhmmss'
    y, m, d = value[0:4], value[4:6], value[6:8]
    t = ':'.join([value[8:10], value[10:12], value[12:14]])
    return y, m, d, t

一本百人词典:

item_dict = {'1': 'SO2', '3': ...}  # please fill this yourself

和CSV DictWriter所需的标头列表:

headers = ['Location', 'Year', 'Month', 'Day', 'Time (24h)', 'Station No.',
           'SO2', 'NO2', 'CO', 'O3', 'PM10', 'PM2.5', 'Meter Status']

我们打开CSV文件并将其读入列表raw_data(请填写文件名).raw_data的每一个元素都是一个词典:

with open(r'filepath\filename.csv') as file:
    raw_data = list(csv.DictReader(file))

我们现在创建一个空的dict data,然后遍历raw_data,处理其数据并将其写入dict(在必要的位置添加注释):

data = {}

for rec in raw_data:
    loc = rec['LOC_CODE']
    if loc not in data:
        data[loc] = dict.fromkeys(headers, '')
    
    # rec is from old data, record is for the new data
    record = data[loc]
    
    if not record['Year']:
        # assumed that date & time for a location is same for all ITEM_CODE
        (record['Year'],
        record['Month'],
        record['Day'],
        record['Time (24h)']
        ) = get_datetime(rec['DATA_DT'])
    
    record['Station No.'] = rec['DATA_STATE']
    record['Meter Status'] = rec['DATA_NOVER']
    # for the readings we get the apt key using item_dict
    record[item_dict[rec['ITEM_CODE']]] = rec['DATA_VALUE']

最后,我们按照csv.DictWriter期望的方式将data中的所有记录排列到一个dict的列表中,并将其写入输出CSV文件(请自己填写文件名):

records = [{**v, 'Location': k} for k, v in data.items()]

with open(r'filepath\newfilename.csv', 'w') as file:
    writer = csv.DictWriter(file, fieldnames=headers, lineterminator='\n')
    writer.writeheader()
    writer.writerows(records)

(您的表中没有值的所有ITEM_CODE将在创建的CSV中显示一个空单元格)


当然,您必须根据您的需求调整此代码-如果您希望它不删除CSV please中的现有数据,请将模式从'w'更改为'a''r+',并相应地修改代码的数据编写部分.同样,如果您想要按日期或按降序对数据进行排序,请在开始之前执行相同的操作.

我应该将所有代码合并为一个代码,还是留给读者,在下面发表 comments ……;P

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

Python 约束无法解决n皇后之谜

对于一个给定的数字,找出一个整数的最小和最大可能的和

无法通过python-jira访问jira工作日志(log)中的 comments

使用setuptools pyproject.toml和自定义目录树构建PyPi包

我对我应该做什么以及我如何做感到困惑'

海上重叠直方图

在单个对象中解析多个Python数据帧

让函数调用方程

基于形状而非距离的两个numpy数组相似性

网格基于1.Y轴与2.x轴显示在matplotlib中

Python全局变量递归得到不同的结果

Flash只从html表单中获取一个值

比Pandas 更好的 Select

从一个df列提取单词,分配给另一个列

GPT python SDK引入了大量开销/错误超时

mdates定位器在图表中显示不存在的时间间隔

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

python3中np. divide(x,y)和x/y有什么区别?'