将CSV文件按多列拆分为Pandas数据帧

3
我有一个包含多列的tsv文件。其中有10列及以上,但对我来说重要的列是名称为user_name、shift_id、url_id的列。我想创建一个数据框,首先根据user_names将整个csv文件分组,即仅将具有相同user_name的行分组在一起。从该块中,我制作另一个块,仅将具有某些shift_id的行分组在一起,然后从该块中制作具有相同url的块。很遗憾,由于公司规定,我不能分享数据,而创建虚构数据表可能会更加混乱。
另外两列具有时间戳。我想计算块的时间持续时间,但只有在将块按这些列分组后才能进行。
我已经看到过通过特定列值拆分数据框的答案,但在我的情况下,我有三个列值,它们被分隔的顺序也很重要。
谢谢你的帮助!

1
可以向我们展示一些数据,或者代码,或者任何东西。 - Stephen Rauch
@开源,我的编辑有帮到吗? - aztec242
你是想创建一个 dataframe,其中 username = x, col2 = y 和 col3 = z 吗? - niraj
@开源 是的,听起来是对的。其他列会有不同的值,但这些列将具有相同的值。 - aztec242
我仍然不确定应该是什么,但我会尝试提供你可以使用 pandas 做的例子。 - niraj
显示剩余3条评论
1个回答

2
假设您已经将列读入到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和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

这很棒。但是假设您有更多的行,其中col1中有1,col2中有4,col3中有7。由于顺序很重要,我首先想要所有具有col1中为1的行。然后从这些行中,我想要所有具有col2中为4的行,然后从这些行中,我想要col3中为7的行。最终,我将拥有col1中为1,col2中为4和col3中为7的行以及其他具有不同值的列。然后我需要对其他列进行操作。希望这可以帮到您。非常感谢您的时间和耐心。我欠您一个大人情!! - aztec242
@BinamrataSharma 我添加了更新的部分,不知道它是否符合你的意思。我仍然不知道为什么顺序很重要,因为我们正在寻找三列的交集。 - niraj
1
这很好。我会从这里开始尝试。但是,我想要的不是像col1 == 1这样具体的东西,而是像对于该列中每个唯一值一样通用的东西,因为手动跟踪所有列中的唯一值将是不可能的。但这是一个很好的开端。 - aztec242

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接