2017-06-19 102 views
2

我有一个包含多列的tsv文件。有10列以上的列,但对我来说重要的列是名称为user_name,shift_id,url_id的列。我想创建一个数据框架,它首先根据user_names分隔整个csv文件,即只有具有相同user_name的行才被分组在一起。从该块创建另一个块,其中只有具有某个shift_id的行被组合在一起,然后从该块创建具有相同url的块。不幸的是,由于公司的规则,不能共享数据,并且使虚构的数据表可能更令人困惑。将csv文件分割成多列的熊猫数据帧

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

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

谢谢你的帮助!

+0

您的意思是“dataframe”只选择3个重要的列吗? – 0p3n5ourcE

+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 

现在,usinig如上类似掩蔽:

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 
+0

这太好了。但是,假设col1中有更多的行,col1中有1行,col2中有更多不同的行,4中有更多,7中有更多。由于顺序很重要,我首先需要col1中有1的所有行。然后从这些行中,我想要col2中有4个的所有行,然后从这些行中我想要col3中有7个的行。最后,我将有col1中的1,col2中的4,col3中的7以及其他具有不同值的cols。我需要在其他列上操作。我希望这有助于。非常感谢你的时间和耐心。我欠你很多时间! –

+0

@BinamrataSharma我添加了更新的部分,不知道这是不是你的意思。我仍然不知道为什么要排序,因为我们正在寻找三列交叉点。 – 0p3n5ourcE

+1

这很好。我会尝试从这里开始。但不是说col1 == 1,而是想要一些类似于此列中每个唯一值的泛型,因为它不可能手动跟踪所有列中的唯一值。但这是一个很好的开始。 –