【问题标题】:Create new proper time-dataset from raw data with Python使用 Python 从原始数据创建新的正确时间数据集
【发布时间】:2021-10-14 16:40:05
【问题描述】:

首先,如果这个问题已经被问过,我很抱歉,但我相信我的挑战已经足够具体了。我不是在寻找完整的答案,而只是在寻找如何进行的指导。

  1. 首先,我有一个监控参与者的原始数据集。这些数据包括收入、储蓄等……这些参与者已被跟踪 6 个月(1 月至 6 月)。但数据存储在一个完整的 Excel 文件中,其中有一列指定月份,这意味着一个参与者的姓名在文件中出现 6 次,每个月一个。每个参与者都有一个唯一的 ID。

  2. 我想以一种更可行的方式转换这些数据,并且我想学习用 Python 来做这件事。但后来我感到卡住和生疏,因为我编码已经很久了,而且我只习惯于定期使用的代码(打印分组平均值等......);这是我要遵循的步骤:

一个。首先创建一个列,其中包含已使用 ID 跟踪的参与者的唯一列表。每个参与者只能被引用一次;

b.每个参与者都在原始文件中记录了一个活动和子活动类型,这也需要添加到新数据集中;

c。例如,对于 1 月份,我想创建一个“january_income”列,其中从原始数据集中拖出 1 月份的收入,以此类推每个变量和每个月。

任何人都可以就我如何进行操作提供指导吗?正如我所说,它不必是特定的代码,它可以是方法或步骤以及我可以使用的功能。

已经非常感谢了。 N.B:我使用 Spyder 作为工作环境。

【问题讨论】:

  • 欢迎来到 Stackoverflow!目前,我将此问题标记为“需要更多关注”,因为这个问题似乎是一次询问多个步骤。请注意,Stackoverflow 不是免费的教程提供者,这个问题非常笼统地询问构成教程的内容,而不是询问特定问题。以下是一些建议:您可以编辑问题以专注于问题的特定步骤/部分,并提供您的代码尝试。堆栈溢出更像是一个有问题的代码助手,而不是免费的代码/教程提供者。无论如何祝你好运:D

标签: python excel spyder xlsx data-transform


【解决方案1】:

感谢您的注释。首先,如果我的帖子不具体,我很抱歉,感谢您在社区中发起我。自从我发表第一篇文章以来,我一直在努力处理我的数据,并且根据我对语言的实际了解,我所能想出的只是一个过滤代码,如下面的代码所示。这让我可以为每个月的每个数据创建一个列,但我遇到了两件事:首先,我必须为每个月重复此代码并更改标签中的月份。如果我不必面对另一个问题,我不会介意这种方法:这没有考虑到某些参与者在某些月份没有被跟踪的事实,这意味着即使数据是根据 ID 号排序的,列之间存在不匹配,因为它们的长度根据该月跟踪的参与者数量而变化。现在我希望通过添加一行来优化这段代码,这可以让我解决我的第二个问题(此时我不介意代码是否很长,但如果可以进行优化,我也打开它):

os.chdir("XXXXXXX")
economique = pd.read_csv('data_economique.csv')
#JANVIER
ID_jan = economique.query("mois_de_suivi == 'Janvier'")["ID"]
nom_jan = economique.query("mois_de_suivi == 'Janvier'")["nom"]
sexe_jan = economique.query("mois_de_suivi == 'Janvier'")["sexe"]
district_jan = economique.query("mois_de_suivi == 'Janvier'")["district"]
activite_jan = economique.query("mois_de_suivi == 'Janvier'")["activite"]
CA_jan = economique.query("mois_de_suivi == 'Janvier'")["chiffre_affaire"]
charges_jan = economique.query("mois_de_suivi == 'Janvier'")["charges"]
resultat_jan = economique.query("mois_de_suivi == 'Janvier'")["benefice"]
remb_attendu_jan = economique.query("mois_de_suivi == 'Janvier'")["remb_attendu"]
remb_effectue_jan = economique.query("mois_de_suivi == 'Janvier'")["remb_effectue"]
remb_differe_jan = economique.query("mois_de_suivi == 'Janvier'")["calcul_remb_differe"]
epargne_jan = economique.query("mois_de_suivi == 'Janvier'")["calcul_epargne"]

【讨论】:

    【解决方案2】:

    您的问题并不具体。但您可以尝试调整以下代码:

    import csv
    """
    Convert your excel file to csv format
    This sample assumes that you have a csv file with the first row as header or fieldnames
    """
    with open('test.csv','w') as fp:
        fp.write("""ID,Name,Income,Savings,Month
    1,"Sample Name",1000,100,1
    """)
    def format(infile = 'infile.csv', outfile='outfile.csv'):
        months = ['January', 'February', 'March'] #Add specific months
        target_fields = ['Income', 'Savings'] # Add your desired fields
        timestamp_field = 'Month'  #The field which indicate the month of the row
        ID_field = 'ID' # The field which indicates the unique identifier of the participant
        part_specific_fields = [ID_field, 'Name'] # The fields which are specific for each participant, these fields won't be touched at all.
        target_combined_fields = [f'{month}_{field}' for field in target_fields for month in months]
        total_fields = part_specific_fields + target_combined_fields
        temp = {}
        with open(infile,'r') as fpi, open(outfile,'w') as fpo:
            reader = csv.DictReader(fpi)
            for row in reader:
                ID = int(row[ID_field])
                if ID not in temp:
                    temp[ID] = {}
                for other_field in part_specific_fields:
                    # Insert the constant columns that should not be touched
                    temp[ID][other_field] = row[other_field]
                month_pos = int(row[timestamp_field]) - 1 # subtract 1 for 0 indexing
                month = months[month_pos] # Month name in plain English
                for field in target_fields:
                    temp[ID][f'{month}_{field}'] = row[field]
             # All the processing completed
             #now write the data
            writer = csv.DictWriter(fpo, fieldnames=total_fields)
            writer.writeheader()
            for row in temp.values():
                writer.writerow(row)
            # File has been wriiten successfully
            #now return the mapped dictionary
        return temp
    print(format('test.csv'))
    
    1. 首先,您必须将.xls 文件转换为.csv 格式
    2. 处理每一行并将其映射到特定的<month>_<field> 键。
    3. 将处理后的数据写入outfile.csv文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2019-01-09
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多