有没有一种方法可以使用列名比较来拆分DF?

时间:2020-07-05 19:12:03

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

我对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

2 个答案:

答案 0 :(得分:0)

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

除此之外,这里不是将csv中的嵌套字段读取到二维数据框中的理想解决方案,并且在数据框中包含嵌套对象通常很棘手。

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

答案 1 :(得分:0)

尽管我没有您的复杂数据来提供更具体的解决方案。我能够用 .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平台中使用了Notebook来执行和测试代码。