如何按 Pandas 中的列数对数据进行分组?

How to group data by count of columns in Pandas?

我有一个包含很多行和不同列数的 CSV 文件。

如何按列数对数据进行分组并在不同的框架中显示?

文件 CSV 具有以下数据:

1 OLEG US FRANCE BIG
1 OLEG FR 18
1 NATA 18

因为我在每一行中有不同数量的列,所以我必须按列数对行进行分组并显示 3 个帧才能设置 header 然后:

        ID NAME  STATE COUNTRY HOBBY 
   FR1: 1  OLEG    US   FRANCE  BIG

        ID NAME  COUNTRY AGE
   FR2: 1   OLEG   FR    18


  FR3:  
     ID  NAME AGE
     1  NATA    18

随便说一句,我需要按列数对行进行分组,并在不同的数据框中显示它们。

因为 pandas 不允许您使用不同长度的列,所以不要使用它来导入数据。您的目标是创建三个单独的 df,因此首先将数据作为列表导入,然后处理它及其不同的长度。

解决此问题的一种方法是使用 csv.reader 读取数据并创建具有列表理解的 df's 以及列表长度的条件。

with open('input.csv', 'r') as f:
    reader = csv.reader(f, delimiter=' ')
    data= list(reader)
    
df1 = pd.DataFrame([item for item in data if len(item)==3], columns='ID NAME AGE'.split())
df2 = pd.DataFrame([item for item in data if len(item)==4], columns='ID NAME COUNTRY AGE'.split())
df3 = pd.DataFrame([item for item in data if len(item)==5], columns='ID NAME STATE COUNTRY HOBBY'.split())
    
print(df1, df2, df3, sep='\n\n')

  ID  NAME AGE
0  1  NATA  18

  ID  NAME COUNTRY AGE
0  1  OLEG      FR  18

  ID  NAME STATE COUNTRY HOBBY
0  1  OLEG    US  FRANCE   BIG

如果您需要为同一步骤硬编码太多行(例如太多 df's),那么您应该考虑使用循环来创建它们并将每个数据帧存储为 key/value字典.

编辑 这是创建这些 df's 的小优化方式。我认为您无法绕过创建要用于单独 df's 的列列表,因此您需要知道数据中列数的变化(除非您想创建那些 df's 不命名列。

col_list=[['ID', 'NAME', 'AGE'],['ID', 'NAME', 'COUNTRY', 'AGE'],['ID', 'NAME', 'STATE', 'COUNTRY', 'HOBBY']]

with open('input.csv', 'r') as f:
    reader = csv.reader(f, delimiter=' ')
    data= list(reader)

dict_of_dfs = {}
for cols in col_list:
    dict_of_dfs[f'df_{len(cols)}'] = pd.DataFrame([item for item in data if len(item)==len(cols)], columns=cols)
    
for key,val in dict_of_dfs.items():
    print(f'{key=}: \n {val} \n')

key='df_3': 
   ID  NAME AGE
0  1  NATA  18 

key='df_4': 
   ID  NAME COUNTRY AGE
0  1  OLEG      FR  18 

key='df_5': 
   ID  NAME STATE COUNTRY HOBBY
0  1  OLEG    US  FRANCE   BIG 

现在您的 df 没有变量,而是将它们作为键放在字典中。 (我用它的列数命名 dfdf_3 是具有三列的 df

如果你需要用pandas导入数据,你可以看看这个post