如何按 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
没有变量,而是将它们作为键放在字典中。 (我用它的列数命名 df
,df_3
是具有三列的 df
。
如果你需要用pandas导入数据,你可以看看这个post。
我有一个包含很多行和不同列数的 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
没有变量,而是将它们作为键放在字典中。 (我用它的列数命名 df
,df_3
是具有三列的 df
。
如果你需要用pandas导入数据,你可以看看这个post。