Python 按第一列中的某些值拆分数据帧?

Python 按第一列中的某些值拆分数据帧?,python,pandas,Python,Pandas,我有这样一个数据帧: 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

我有这样一个数据帧:

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
有没有一个简单的方法来实现这一点

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
以根据这些组号对数据帧进行分组
df.groupby(…)
返回一个iterable,它允许您在子组中循环。

对我来说,它看起来像一个凌乱的数据集。产品线不是必需的,因为这只是一个汇总统计数据。很可能最好使用纯python进行数据转换。之后,您可以使用pandas来计算所有需要的统计数据。你能提供一个原始数据的例子吗?哇,这是天才,它工作得很完美。非常感谢,先生。