2017-02-04 114 views
2

我有這樣一個數據幀:按第一列中的某些值拆分數據幀?

A   C1 C2 Total 

PRODUCT1 8 11 19 
rs1  5 9 14  
rs2  2 2 4 
rs3  1 0 1 
PRODUCT2 21 12 33 
rs7  11 7 18  
rs2  7 3 10 
rs1  3 1 4 
rs9  0 1 1 
PRODUCT3 2 11 13 
rs9  1 6 7  
rs5  1 5 6 

列A由字符串,我想的價值觀在此列分割我的數據幀,特別是在它的每一個高位字。像這樣:

df1 = 

PRODUCT1 8 11 19 
rs1  5 9 14  
rs2  2 2 4 
rs3  1 0 1 

df2 = 

PRODUCT2 21 12 33 
rs7  11 7 18  
rs2  7 3 10 
rs1  3 1 4 
rs9  0 1 1 

df3 = 

PRODUCT3 2 11 13 
rs9  1 6 7  
rs5  1 5 6 

有沒有簡單的方法來實現這一目標?

+0

對我來說,看起來像一個凌亂的數據集。產品線不是必需的,因爲這只是一個彙總統計。最可能的情況是使用純Python進行數據轉換。之後,你可以使用熊貓來計算你想要的所有統計數據。你能舉一個例子說明原始數據的外觀嗎? – Moritz

回答

4
import pandas as pd 
df = pd.DataFrame({'A': ['PRODUCT1', 'rs1', 'rs2', 'rs3', 'PRODUCT2', 'rs7', 'rs2', 'rs1', 'rs9', 'PRODUCT3', 'rs9', 'rs5'], 'C1': [8, 5, 2, 1, 21, 11, 7, 3, 0, 2, 1, 1], 'C2': [11, 9, 2, 0, 12, 7, 3, 1, 1, 11, 6, 5], 'Total': [19, 14, 4, 1, 33, 18, 10, 4, 1, 13, 7, 6]}) 

for key, group in df.groupby(df['A'].str.isupper().cumsum()): 
    print(group) 

打印

  A C1 C2 Total 
0 PRODUCT1 8 11  19 
1  rs1 5 9  14 
2  rs2 2 2  4 
3  rs3 1 0  1 
      A C1 C2 Total 
4 PRODUCT2 21 12  33 
5  rs7 11 7  18 
6  rs2 7 3  10 
7  rs1 3 1  4 
8  rs9 0 1  1 
      A C1 C2 Total 
9 PRODUCT3 2 11  13 
10  rs9 1 6  7 
11  rs5 1 5  6 

這裏的想法是,以確定哪些是大寫行:

In [95]: df['A'].str.isupper() 
Out[95]: 
0  True 
1  False 
2  False 
3  False 
4  True 
5  False 
6  False 
7  False 
8  False 
9  True 
10 False 
11 False 
Name: A, dtype: bool 

然後使用cumsum採取累計總和,其中True被視爲1和False被視爲0:

In [96]: df['A'].str.isupper().cumsum() 
Out[96]: 
0  1 
1  1 
2  1 
3  1 
4  2 
5  2 
6  2 
7  2 
8  2 
9  3 
10 3 
11 3 
Name: A, dtype: int64 

這些值可以用作組號。將它們傳遞給df.groupby以根據這些組號碼對DataFrame進行分組。 df.groupby(...)返回一個iterable,它可以讓你遍歷子組。

+0

哇這是天才,它完美的作品。先生非常感謝您。 – Xhoan