如何从"groupby"对象的"单元格"中获取值?
假设我有一个这样的数据表:
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]