如何从"groupby"对象的"单元格"中获取值?

10 投票
3 回答
21892 浏览
提问于 2025-04-17 16:37

假设我有一个这样的数据表:

     A    B  C   D
0  foo  one  1  10
1  bar  one  2  20
2  foo  two  3  30
3  bar  one  4  40
4  foo  two  5  50
5  bar  two  6  60
6  foo  one  7  70
7  foo  two  8  80

现在我可以根据第一列进行分组:grouped = df.groupby('A')。这样我就得到了一个叫做 DataFrameGroupBy 的对象:

     A            B                 C              D
0  foo  [one,two,two,one,two]  [1,3,5,7,8]  [10,30,50,70,80]
1  bar  [one,one,two]          [2,4,6]      [20,40,60]

现在我想从某个特定的单元格中获取值。我该怎么做呢?比如,我想获取列'D'中,'A'等于'foo'(也就是第一行)那一行的值。换句话说,我想得到 [10,30,50,70,80]。这可能吗?

3 个回答

1

这可能是个老问题,但这是我给出的解决方案:

_b, _c, _d, _s = [], [], [], []

group_df = df.groupby("A")

for s in dict(list(group_df)).keys():

    b_ = group_df.get_group(s)['B'].tolist()
    c_ = group_df.get_group(s)['C'].tolist()
    d_ = group_df.get_group(s)['D'].tolist()    
    _s.append(s)
    _b.append(b_)
    _c.append(c_)
    _d.append(d_)
        
regrouped_df = (
    pd.DataFrame(zip(_s, _b, _c, _d))
    .rename(columns={0: "A", 1: "B", 2: "C", 3: "D"})
)

>> regrouped_df 
         A                          B                C                     D
    0  bar            [one, one, two]        [2, 4, 6]          [20, 40, 60]
    1  foo  [one, two, two, one, two]  [1, 3, 5, 7, 8]  [10, 30, 50, 70, 80]
1

可以通过这个语句来实现:

>>> df.groupby("A").get_group("foo")["D"]
0    10
2    30
4    50
6    70
7    80
Name: D
15

你是在想像这样的吗?

>>> df
     A    B  C   D
0  foo  one  1  10
1  bar  one  2  20
2  foo  two  3  30
3  bar  one  4  40
4  foo  two  5  50
5  bar  two  6  60
6  foo  one  7  70
7  foo  two  8  80
>>> df.groupby("A").get_group("foo")["D"]
0    10
2    30
4    50
6    70
7    80
Name: D
>>> df.groupby("A").get_group("foo")["D"].tolist()
[10, 30, 50, 70, 80]

撰写回答