我有10个文件,这些文件具有以下相同的格式和列名(不同文件中的值不同):
event_code timestamp counter
0 9071 1165783 NaN
1 9070 1165883 NaN
2 8071 1166167 NaN
3 7529 NaN 0.0
4 8529 NaN 1.0
5 9529 NaN 1.0
由于文件的性质,我试图将这些数据存储在多级数据框中,如下所示:(最终,我希望box_num
级别一直上升到10)
box_num 1 2 ...
col_names event_code timestamp counter |event_code timestamp counter
0 9071 1270451 1 | 8529 NaN 1 ...
1 9070 1270484 0 | 9529 NaN 0 ...
2 9071 1270736 1 | 5520 3599167 2 ...
3 9070 1272337 3 | 7171 3599169 1 ...
最初,我以为我可以用字典创建一个多级数据帧,并使用键作为层次结构索引,并将数据帧作为被征服的数据帧
col_names = ['event_code','timestamp', 'counter']
df_dict = {}
for i in range(len(files)):
f = files[i] # actual file name
df = pd.read_csv(f, sep=":", header=None, names=col_names)
df_dict[i+1] = df # 'i+1' so that dict_key can correspond to actual box number
但是我很快意识到我无法从字典创建多级索引或数据框。所以要创建一个多级索引,这就是我所做的,但是现在我被困在下一步要做的事情上……
(box_num, col_list) = df_dict.keys(), list(df_dict.values())[0].columns
如果还有其他更有效,简洁的方法来解决此问题,请也告诉我。理想情况下,我想在for循环之后立即创建多级数据框
因此,我最终找到了一种使用pd.concat()从for循环创建多级数据帧的方法。我将在下面发布我的答案。希望它对某人有帮助。
col_names = ['event_code', 'timestamp', 'counter']
result = []
box_num = []
for i in range(len(files)):
f = files[i]
box_num.append(i+1) # box_number
df = pd.read_csv(f, sep=":", header=None, names=col_names)
result.append(df)
# # pd.concat() combines all the Series in the 'result' list
# # 'Keys' option adds a hierarchical index at the outermost level of the data.
final_df = pd.concat(result, axis=1, keys=box_num, names=['Box Number','Columns'])
答案 0 :(得分:0)
我认为您应该为此任务使用数据透视表或pandas groupby函数。两者都不能完全满足您上面的要求,但是使用起来会更简单。
以您的代码为起点:
col_names = ['event_code','timestamp', 'counter']
data = pd.DataFrame()
for i in range(len(files)):
f = files[i]
df = pd.read_csv(f, sep=":", header=None, names=col_names)
# instead of a dictionary try creating a master DataFrame
df['box_num'] = i
data = pd.concat([data, df]).reset_index(drop=True)
data['idx'] = data.index
# option 1 create a pivot table
pivot = data.pivot(index='idx', columns='box_num', values=col_names)
# option 2 use pandas groupby function
group = data.groupby(['idx', 'box_num']).mean()
希望其中之一可以帮助您朝正确的方向前进或为您要实现的目标而努力。祝你好运!