通过多列将csv文件拆分为panda数据帧

时间:2017-06-19 03:28:43

标签: python python-3.x csv pandas

我有一个包含多列的tsv文件。有10个或更多列,但对我来说重要的列是名称为user_name,shift_id,url_id的列。我想创建一个数据框,首先根据user_names分隔整个csv文件,即只有具有相同user_name的行被分组在一起。从那个块我创建另一个块,其中只有具有特定shift_id的行被组合在一起,然后从该块创建具有相同url的块。遗憾的是,由于公司规则并且假想的数据表可能更令人困惑,我无法共享数据。

其他两列中有时间戳。我想计算块的持续时间,但只有在根据这些列对chunk进行分组之后。

我已经看到了按特定列值拆分数据框的答案,但在我的情况下,我有三个列值,它们的分隔顺序也很重要。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

假设您已阅读dataframe

df = pd.DataFrame({'col1':[1,2,3], 'col2':[4,5,6],'col3':[7,8,9],
               'col4':[1,2,3],'col5':[1,2,3],'col6':[1,2,3],
               'col7':[1,2,3],'col8':[1,2,3],'col9':[1,2,3],
               'col91':[1,2,3]})
print(df)

输出:

     col1  col2  col3  col4  col5  col6  col7  col8  col9  col91
0     1     4     7     1     1     1     1     1     1      1
1     2     5     8     2     2     2     2     2     2      2
2     3     6     9     3     3     3     3     3     3      3

现在,我们只能选择三个感兴趣的列,让它为col1, col2, and col3

tmp_df = df[['col1', 'col2', 'col3']]
print(tmp_df)

输出:

     col1  col2  col3
0     1     4     7
1     2     5     8
2     3     6     9

此外,我们希望根据三个列值进行过滤:

final_df = tmp_df[(tmp_df.col1 == 1) & (tmp_df.col2 == 4) & (tmp_df.col3== 7)]
print(final_df)

输出:

    col1  col2  col3
0     1     4     7

阅读dataframe后,上述所有步骤均可在单行中实现:

final = df[['col1', 'col2', 'col3']][(df.col1 == 1) & (df.col2 == 4) & (df.col3== 7)]
final

希望它有所帮助!

更新

df = pd.DataFrame({'col1':[1,1,1,1,1], 'col2':[4,4,4,4,7],'col3':[7,7,9,7,7],
               'col4':['X','X','X','X','X'],'col5':['X','X','X','X','X'],'col6':['X','X','X','X','X'],
               'col7':['X','X','X','X','X'],'col8':['X','X','X','X','X'],'col9':['X','X','X','X','X'],
               'col91':['X','X','X','X','X']})
print(df)

输出:

     col1  col2  col3 col4 col5 col6 col7 col8 col9 col91
0     1     4     7    X    X    X    X    X    X     X
1     1     4     7    X    X    X    X    X    X     X
2     1     4     9    X    X    X    X    X    X     X
3     1     4     7    X    X    X    X    X    X     X
4     1     7     7    X    X    X    X    X    X     X

现在,我们使用类似的屏蔽:

final = df[(df.col1 == 1) & (df.col2 == 4) & (df.col3== 7)]
final

输出:

    col1  col2  col3 col4 col5 col6 col7 col8 col9 col91
0     1     4     7    X    X    X    X    X    X     X
1     1     4     7    X    X    X    X    X    X     X
3     1     4     7    X    X    X    X    X    X     X