通过使用read_csv()从多个文件中读取数据来创建多级DataFrame [已解决]

时间:2019-08-28 02:55:18

标签: python pandas

我有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循环之后立即创建多级数据框

:: UPDATE :: [已解决]

因此,我最终找到了一种使用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'])


1 个答案:

答案 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()

希望其中之一可以帮助您朝正确的方向前进或为您要实现的目标而努力。祝你好运!