【问题标题】:Is there a way to split a DF using column name comparison?有没有办法使用列名比较来拆分 DF?
【发布时间】:2020-07-05 19:12:03
【问题描述】:

我对 Python 非常陌生。我使用 csv 文件创建了一个 DataFrame。我的文件是一个复杂的嵌套 json 文件,具有最低粒度级别的标题值。 【示例】df.columns = [ID1, fullID2, total.count, total.value, seedValue.id, seedValue.value1, seedValue.value2, seedValue.largeFile.id, seedValue.largeFile.value1, seedValue.largeFile.value2......]

要求:我必须使用粒度和 ID1、fullID2 的每个列创建多个较小的 csv。 我认为我的方法是:通过拆分标题值来保存较小的切片。 问题1:无法正确拆分值或遍历到第一个位置进行比较。 [例子] 我正在使用df.columns.str.split('.').tolist()。假设我得到下面列出的值,我想将 id 的 seedValue 与 value1 的 seedValue 进行比较,并将整个部分作为新的 df 提取出来。 {['seedValue','id'],['seedValue'.'value1'], ['seedValue'.'value2']} 问题 2:将 ID1 和 fullID2 添加到这个新的 df。

实现这一目标的任何帮助或指导都会非常有帮助! [最终输出]

df.columns = [ID1, fullID2, total.count, total.value, seedValue.id, seedValue.value1, seedValue.value2, seedValue.largeFile.id, seedValue.largeFile.value1, seedValue.largeFile.value2......]
post-processing the file -
seedValue.columns = ID1,fullID2,id,value1,value2
total.columns = ID1,fullID2,count,value
seedValue.largeFile.columns = ID1,fullID2,id,value1,value2

【问题讨论】:

    标签: python-3.x pandas google-bigquery


    【解决方案1】:

    虽然我没有您的复杂数据来提供更具体的解决方案。我能够使用 .csv 样本数据重现类似案例,这将举例说明如何使用数据实现您的目标。

    为了将每个 ID 保存在不同的文件中,我们需要遍历 ID。此外,假设可能有更多重复的 ID,脚本会将每组 ID 保存到 .csv 文件中。下面是脚本,已经包含示例数据:

    import pandas as pd
    import csv
    
    my_dict = { 'ids' : [11,11,33,55,55],
                       'info' : ["comment_1","comment_2", "comment_3", "comment_4", "comment_5"],
                       'other_column': ["something", "something", "something", "", "something"]}
    
    #Creating a dataframe from the .csv file
    df = pd.DataFrame(my_dict)
    #sorting the value
    df = df.sort_values('ids')
    #g=df.groupby('ids')
    df
    
    #looping through each group of ids and saving them into a file
    for id,g in df.groupby('ids'):
        g.to_csv('id_{}.csv'.format(id),index=False)#, header=True, index_label=False)
    

    还有输出,

    id_11.csv
    id_33.csv
    id_55.csv
    

    例如,在id_11.csv

    ids info      other_column
    11  comment_1 something
    11  comment_2 something
    

    请注意,我们在每个文件的名称中使用 ids 字段。此外,index=False 表示不会为每行数据创建一个带有索引的新列。

    附加信息:我已使用 GCP 内 AI Platform 中的 Notebook 来执行和测试代码。

    【讨论】:

    • 感谢您的输入,它有助于自动化生成 csv 文件。我当前的问题是我需要打开任何具有类型字典的内部列并将它们存储到单独的 csv 中。我猜我必须生成一些要链接这些文件的 ID。例如:``` df5 = pd.DataFrame(df['somecol'].tolist()) df5.columns {A,B,C,{d,e,f,g,h,{i,j,k },l},M,N} ``` 现在我应该将所有内部字典提取到新的 CSV 文件中。要将这些链接在一起,我在想: ``` {A,B,C,ID,M,N} {ID,d,e,f,g,h,id,l} {id,i ,j,k} ``` 欢迎所有输入。谢谢
    • @ZeLearner,您介意分享您的数据,以便我可以在我的环境中进行测试吗?
    • 我已经简单地遍历了整个数据框并提取了所需的列。感谢您的帮助。
    【解决方案2】:

    与更广为人知的pd.read_csv 相比,pandas 通过pd.json_normalize 提供更精细的 json 支持,允许您指定如何取消嵌套数据、使用哪些元数据等。

    除此之外,将嵌套字段从 csv 读取到二维数据帧中可能不是理想的解决方案,而且在数据帧中嵌套对象通常很难处理。

    尝试将文件作为纯字典或字典列表读取。然后,您可以遍历键并创建自定义逻辑,以检查您想要再降低多少级别,如何返回值等等。一旦您处于较低级别并希望将其包含在数据框中,请创建一个新的临时数据框,然后将这些部分一起附加到循环中。

    【讨论】:

    • 谢谢@Frank。我使用该函数对文件的一部分进行规范化,然后可以处理其余部分。
    猜你喜欢
    • 2021-12-06
    • 2014-07-28
    • 1970-01-01
    • 2020-03-13
    • 2019-04-03
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多