如何从pandas中的groupby对象中选择列?

时间:2013-10-05 19:58:30

标签: python pandas

我将数据框分组为

下面的两列
df = pd.DataFrame({'a': [1, 1, 3],
                   'b': [4.0, 5.5, 6.0],
                   'c': [7L, 8L, 9L],
                   'name': ['hello', 'hello', 'foo']})
df.groupby(['a', 'name']).median()

结果是:

            b    c
a name            
1 hello  4.75  7.5
3 foo    6.00  9.0

如何访问结果中位数的name字段(在本例中为hello, foo)?这失败了:

df.groupby(['a', 'name']).median().name

4 个答案:

答案 0 :(得分:15)

您需要获取索引值,它们不是列。在这种情况下1级

df.groupby(["a", "name"]).median().index.get_level_values(1)

Out[2]:

Index([u'hello', u'foo'], dtype=object)

您也可以传递索引名称

df.groupby(["a", "name"]).median().index.get_level_values('name')

因为这比传递整数值更直观。

您可以通过调用tolist()

将索引值转换为列表
df.groupby(["a", "name"]).median().index.get_level_values(1).tolist()

Out[5]:

['hello', 'foo']

答案 1 :(得分:9)

在groupby期间设置as_index = False

df = pandas.DataFrame({"a":[1,1,3], "b":[4,5.5,6], "c":[7,8,9], "name":["hello","hello","foo"]})
df.groupby(["a", "name"] , as_index = False).median()

答案 2 :(得分:2)

您还可以在groupby结果上reset_index()获取现在可以访问名称列的数据框。

import pandas as pd
df = pd.DataFrame({"a":[1,1,3], "b":[4,5.5,6], "c":[7,8,9], "name":["hello","hello","foo"]})
df_grouped = df.groupby(["a", "name"]).median()
df_grouped.name
0    hello
1      foo
Name: name, dtype: object

如果您对单个列执行操作,则返回将是具有多索引的系列,您只需将pd.DataFrame应用于该列,然后重置_index。

答案 3 :(得分:2)

在group by之后使用reset_index()将达到目的:

df = pd.DataFrame({'a': [1, 1, 3],
                   'b': [4.0, 5.5, 6.0],
                   'c': ['7L', '8L', '9L'],
                   'name': ['hello', 'hello', 'foo']})
df.groupby(['a', 'name']).median().reset_index().name

结果如下:

 0    hello
 1      foo
 Name: name, dtype: object

,如果您需要这些值的列表,可以简单地:

df = pd.DataFrame({'a': [1, 1, 3],
                   'b': [4.0, 5.5, 6.0],
                   'c': ['7L', '8L', '9L'],
                   'name': ['hello', 'hello', 'foo']})

df.groupby(['a', 'name']).median().reset_index().name.values

使用值的结果将是一个列表,其中包含名称列的值。上面的代码返回以下列表作为结果:

array(['hello', 'foo'], dtype=object)