当前位置: 首页 > 知识库问答 >
问题:

如何按数据帧按密钥访问熊猫组

苍宜修
2023-03-14

如何通过键访问Groupby对象中相应的Groupby数据框?

使用以下groupby:

rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
                   'B': rand.randn(6),
                   'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])

我可以迭代它来获取密钥和组:

In [11]: for k, gp in gb:
             print 'key=' + str(k)
             print gp
key=bar
     A         B   C
1  bar -0.611756  18
3  bar -1.072969  10
5  bar -2.301539  18
key=foo
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

我想能够访问一个组的关键:

In [12]: gb['foo']
Out[12]:  
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

但是当我试着用gb[('foo',)]这样做时,我得到了一个奇怪的pandas。果心群比。DataFrameGroupBy对象,它似乎没有任何与我想要的数据帧对应的方法。

我能想到的最好的办法是:

In [13]: def gb_df_key(gb, key, orig_df):
             ix = gb.indices[key]
             return orig_df.ix[ix]

         gb_df_key(gb, 'foo', df)
Out[13]:
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14  

但是考虑到熊猫在这些事情上通常有多好,这有点令人讨厌。
这样做的内置方法是什么?

共有3个答案

汤跃
2023-03-14

而不是

gb.get_group('foo')

我更喜欢用gb.groups

df.loc[gb.groups['foo']]

因为这样你也可以选择多列。例如:

df.loc[gb.groups['foo'],('A','B')]
薛彭薄
2023-03-14

Python for Data Analysis中的Wes McKinney(熊猫的作者)提供了以下配方:

groups = dict(list(gb))

它返回一个字典,其键是您的组标签,其值是DataFrames,即。

groups['foo']

将产生您想要的:

     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14
赫连鸿振
2023-03-14

您可以使用get_group方法:

In [21]: gb.get_group('foo')
Out[21]: 
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

注意:这不需要为每个组创建每个子数据帧的中间字典/副本,因此将比使用dict(iter(gb))创建简单字典更节省内存。这是因为它使用groupby对象中已有的数据结构。

您可以使用Groupby切片选择不同的列:

In [22]: gb[["A", "B"]].get_group("foo")
Out[22]:
     A         B
0  foo  1.624345
2  foo -0.528172
4  foo  0.865408

In [23]: gb["C"].get_group("foo")
Out[23]:
0     5
2    11
4    14
Name: C, dtype: int64
 类似资料:
  • 我正在使用从h5文件加载的调查数据作为通过熊猫包。在此中,所有行都是单个调查的结果,而列是单个调查中所有问题的答案。 我的目标是将此数据集缩减为更小的,仅包括在某个问题上具有某个描述答案的行,即在本列中具有相同的值。我能够确定具有此条件的所有行的索引值,但我找不到如何删除这些行或仅使用这些行创建新的df。

  • 问题内容: 如何通过密钥访问groupby对象中的相应groupby数据帧? 通过以下groupby: rand = np.random.RandomState(1) df = pd.DataFrame({‘A’: [‘foo’, ‘bar’] * 3, ‘B’: rand.randn(6), ‘C’: rand.randint(0, 20, 6)}) gb = df.groupby([‘A’])

  • 我想过滤熊猫DataFrame,它从DataFrame中过滤掉除值中声明的行之外的所有其他列。我如何才能做到这一点并获得预期输出。 预期输出:

  • 假设我有2个数据帧: DF1: Col1 | Col2 | Col3 XCN000370/17-18C|XCN0003711718C|0003971718 DF2 Col1 | Col2 | Col3 XCN0003711718C|XCN0003711718C|0003971718 我希望它们像这样合并: 首次匹配Col1(DF1)和Col1(DF2) 在保持不匹配的情况下,将Col1(DF1)与

  • 我对访问中的数据的几种方法进行了比较。请参阅下面的结果。最快的访问是在上使用方法。在这篇文章中提到了我。 令我惊讶的是,通过访问比通过底层的 numpy 对象 访问更快。 我的问题是,有没有一种方法可以像我通过< code>get_value访问熊猫数据帧一样快速地访问numpy数组的元素? 10000个回路,最佳3:108µs/回路 最慢的运行时间是最快的5.42倍。这可能意味着正在缓存中间结果

  • 问题内容: 要按单列过滤数据帧(df),如果我们考虑男性和女性的数据,则可以: 问题1-但是,如果数据跨越多年并且我只想看2014年的男性,该怎么办? 用其他语言,我可能会做类似的事情: (除了我要执行此操作,并在新的数据框对象中获取原始数据框的子集) 问题2。如何循环执行此操作,并为每个唯一的年份和性别集创建一个数据框对象(例如,2013-男,2013-女,2014-男和2014-女的df 问题