仅按键分组,不执行任何其他更改

Only groupby a key and not performing any other changes

是否可以仅按键对行进行分组,而不对要索引的键列以外的任何其他列执行任何更改? 如果是,我们该怎么做?

df = pd.DataFrame({
            'id': ['A','A','A','B','B','C','C','C','C'],
            'data1': [11,35,46,11,26,25,39,50,55],
            'data2': [1,1,1,1,1,2,2,2,2],      
         })
df

我想要一个框架,其中我们将 ['A', 'B', 'C'] 作为索引,data1 和 data2 的每一行存储到索引 A if id=A,索引 B if id=B 和索引 C if id=C

像这样:

   data1  data2
A   11      1
    35      1
    46      1
B   11      1
    26      1
C   25      2
    39      2
    50      2
    55      2

如果我理解正确,你可以遍历 DataFrame.groupby():

的结果
for idx, g in df.groupby("id"):
    print("Idx =", idx)
    print(g)
    print("-" * 80)

打印:

Idx = A
  id  data1  data2
0  A     11      1
1  A     35      1
2  A     46      1
--------------------------------------------------------------------------------
Idx = B
  id  data1  data2
3  B     11      1
4  B     26      1
--------------------------------------------------------------------------------
Idx = C
  id  data1  data2
5  C     25      2
6  C     39      2
7  C     50      2
8  C     55      2
--------------------------------------------------------------------------------

为什么不把id设为索引呢?像这样:

df = pd.DataFrame({
            'id': ['A','A','A','B','B','C','C','C','C'],
            'data1': [11,35,46,11,26,25,39,50,55],
            'data2': [1,1,1,1,1,2,2,2,2],      
         })

df.set_index(['id'], inplace=True)
df[df.index.isin(['A'])]

输出 1:


或者可以创建一个假的多重索引?

df = pd.DataFrame({
            'id': ['A','A','A','B','B','C','C','C','C'],
            'data1': [11,35,46,11,26,25,39,50,55],
            'data2': [1,1,1,1,1,2,2,2,2],      
         })

### create empty column
df['empty'] = ''

### create multi index
df.set_index(['id','empty'], inplace=True)

# rename index to none if you dont want index name
df.index.set_names(None, level=0, inplace=True)

### query like this
df.loc[df.index.get_level_values(0) == 'A']

## or like this
df.loc[df.index.get_level_values(0) == 'A'].droplevel(1)