在pandas中使用groupby,如何从输出的DataFrame中排除分组列?

4

我试图对pandas数据框进行分组,使其保持键为索引,但不包括每个组中的键。

以下是我所说的内容的示例。

  1. 原始数据框

    ungrouped_df = pd.DataFrame({'col1':['A','A','B','C','C','C'], 'col2':[8,5,1,4,1,2], 'col3':[7,4,2,1,2,1],'col4':[1,8,0,2,0,0]})

输出:

| index | col1 | col2 | col3 | col4 |
|-------|------|------|------|------|
| 1     |    A |    8 |    7 |    1 |
| 2     |    A |    5 |    4 |    8 |
| 3     |    B |    1 |    2 |    0 |
| 4     |    C |    4 |    1 |    2 |
| 5     |    C |    1 |    2 |    0 |
| 6     |    C |    2 |    1 |    0 |
  1. 现在,我想从已分组的数据框中创建一个numpy数组

    grouped_df = ungrouped_df.groupby(by='col1', group_keys=False).apply(np.asarray)

这是我得到的结果

| index | col1                                      | 
|-------|-------------------------------------------|
| A     | [[A, 8, 7, 1],[A, 5, 4, 8],[A, 8, 7, 1]]  |
| B     | [[B, 1, 2, 0]]                            |
| C     | [[C, 4, 1, 2], [C, 1, 2, 0], [C, 2, 1, 0]]|
  1. 这是我想要的结果

out:

| index | col1                             | 
|-------|----------------------------------|
| A     | [[8, 7, 1],[5, 4, 8],[8, 7, 1]]  |
| B     | [[1, 2, 0]]                      |
| C     | [[4, 1, 2], [1, 2, 0], [2, 1, 0]]|

我需要一些建议,因为我有点迷茫。我以为 "group_keys=False" 就可以解决问题,但似乎不行。非常感谢您的帮助。
谢谢。
2个回答

6

一般来说,我不建议在列中存储列表,但最明显的解决方法是确保不对不想要的列进行分组。

您可以通过以下方式指定:

  1. 在分组之前将 "col1" 设置为索引,或
  2. 在分组之前删除 "col1",或者
  3. 选择您想要分组的列

df.set_index('col1').groupby(level=0).apply(np.array)

col1
A               [[8, 7, 1], [5, 4, 8]]
B                          [[1, 2, 0]]
C    [[4, 1, 2], [1, 2, 0], [2, 1, 0]]

或者,

df.drop('col1', 1).groupby(df['col1']).apply(np.array)

col1
A               [[8, 7, 1], [5, 4, 8]]
B                          [[1, 2, 0]]
C    [[4, 1, 2], [1, 2, 0], [2, 1, 0]]

或者,

(df.groupby('col1')[df.columns.difference(['col1'])]
   .apply(lambda x: x.values.tolist()))

col1
A               [[8, 7, 1], [5, 4, 8]]
B                          [[1, 2, 0]]
C    [[4, 1, 2], [1, 2, 0], [2, 1, 0]]
dtype: object

嗨,第一和第二个选项对我的情况非常适合。这太容易了!非常感谢 :) - LIB

2

让我们尝试使用pd.Series.groupby

df = df.drop('col1',1).agg(list,1).groupby(df.col1).agg(list).reset_index(name='out')

...

df
  col1                                out
0    A             [[8, 7, 1], [5, 4, 8]]
1    B                        [[1, 2, 0]]
2    C  [[4, 1, 2], [1, 2, 0], [2, 1, 0]]

嗯,输出似乎不对,结果中应该只有整数。你能看一下吗? :-) - cs95

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