我有一个CSV文件,有很多行和不同数量的列。
如何按列计数分组数据并在不同的帧中显示?
CSV文件包含以下数据:
1 OLEG US FRANCE BIG
1 OLEG FR 18
1 NATA 18
因为我每一行有不同的列数我必须按列数对行进行分组并显示3帧才能设置标题然后:
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='nn')
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
),那么你应该考虑使用循环来创建它们,并将每个数据帧作为键/值存储在字典中。
编辑这里是创建这些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导入数据,你可以看看这篇文章。