在熊猫中用字典分组

时间:2017-06-09 12:01:10

标签: python pandas

我正在阅读Wes McKinney在python中的数据分析

分组信息可能以阵列以外的形式存在。让我们考虑另一个 示例DataFrame:

In [38]: people = DataFrame(np.random.randn(5, 5),
....: columns=['a', 'b', 'c', 'd', 'e'],
....: index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])

In [39]: people.ix[2:3, ['b', 'c']] = np.nan # Add a few NA values

现在,假设我有一个列的对应关系,并希望总结 按组分组:

In [41]: mapping = {'a': 'red', 'b': 'red', 'c': 'blue',
               ....: 'd': 'blue', 'e': 'red', 'f' : 'orange'}

现在,您可以轻松地从此dict构造一个数组以传递给groupby,但相反 我们可以通过这个词:

In [42]: by_column = people.groupby(mapping, axis=1)

我的问题是作者的意思是"从这个dict轻松构造一个数组以传递给groupby"。

另一个问题是我们如何从dict构造列表并传递给数组并获得与下面相同的结果

by_column = people.groupby(mapping, axis=1)

请解释

1 个答案:

答案 0 :(得分:1)

dict mapping用于将people的列名映射到用于分组的颜色。作为将此地图传递给groupby的替代方法,我们可以使用

单独执行此步骤
people.columns = [mapping[col] for col in people.columns]

使用列表理解,或

people.columns = people.columns.to_series().map(mapping)

用pandas方法获得类似的效果

除此之外 - 对于pandas map对象,Index似乎还不能使用字典,从0.20.2开始,如果走这条路线则需要to_series()

然后groupby

by_column2 = people.groupby(people.columns, axis=1)

给出相同的结果。例如:

In [11]: by_column.sum()
Out[11]: 
            blue       red
Joe     0.548220  1.744519
Steve  -2.056899  0.907479
Wes     0.093676 -2.145836
Jim     1.782462  0.715873
Travis -0.066277 -2.286108

In [12]: by_column2.sum()
Out[12]: 
            blue       red
Joe     0.548220  1.744519
Steve  -2.056899  0.907479
Wes     0.093676 -2.145836
Jim     1.782462  0.715873
Travis -0.066277 -2.286108

我认为这应该涵盖问题2,但请告诉我,如果这不是你想要采取的目标。我想问题1,作者只是意味着这一点,上面的内容很容易做到,在所演示的方法之上采取了额外的一条线。