将计算列附加到现有数据框

时间:2013-12-23 06:03:24

标签: python pandas

我开始学习Pandas,我正在关注问题here并且无法让解决方案为我工作而且我得到索引错误。这就是我所拥有的

from pandas import *
import pandas as pd
d = {'L1' : Series(['X','X','Z','X','Z','Y','Z','Y','Y',]),
     'L2' : Series([1,2,1,3,2,1,3,2,3]),
     'L3' : Series([50,100,15,200,10,1,20,10,100])}
df = DataFrame(d)  
df.groupby('L1', as_index=False).apply(lambda x : pd.expanding_sum(x.sort('L3', ascending=False)['L3'])/x['L3'].sum())

输出以下内容(我正在使用iPython)

L1   
X   3    0.571429
    1    0.857143
    0    1.000000
Y   8    0.900901
    7    0.990991
    5    1.000000
Z   6    0.444444
    2    0.777778
    4    1.000000
dtype: float64

然后,我尝试在帖子

中建议的标签“new”下附加累积数字计算
df["new"] = df.groupby("L1", as_index=False).apply(lambda x : pd.expanding_sum(x.sort("L3", ascending=False)["L3"])/x["L3"].sum())

我明白了:

   2196                         value = value.reindex(self.index).values
   2197                     except:
-> 2198                         raise TypeError('incompatible index of inserted column '
   2199                                         'with frame index')
   2200 
TypeError: incompatible index of inserted column with frame index

有人知道问题是什么吗?如何将计算出的值重新插入到数据框中,以便按顺序显示值(对于每个标签X,Y,Z,按“new”降序。)

1 个答案:

答案 0 :(得分:18)

问题是,正如错误消息所示,您要插入的计算列的索引与df的索引不兼容。

df的索引是一个简单的索引:

In [8]: df.index
Out[8]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype='int64')

虽然计算列的索引是MultiIndex(正如您在输出中已经看到的那样),假设我们称之为new_column

In [15]: new_column.index
Out[15]: 
MultiIndex
[(u'X', 3), (u'X', 1), (u'X', 0), (u'Y', 8), (u'Y', 7), (u'Y', 5), (u'Z', 6), (u'Z', 2), (u'Z', 4)]

因此,您无法将其插入框架中。但是,这是0.12 中的错误,因为这在0.13中起作用(对于链接问题中的答案已经过测试),关键字as_index=False应确保列{{1} }未添加到索引中。

0.12 的解决方案:
删除MultiIndex的第一级,以便返回原始索引:

L1

在pandas 0.13(开发中)中,这是固定的(https://github.com/pydata/pandas/pull/4670)。出于这个原因,In [13]: new_column = df.groupby('L1', as_index=False).apply(lambda x : pd.expanding_sum(x.sort('L3', ascending=False)['L3'])/x['L3'].sum()) In [14]: df["new"] = new_column.reset_index(level=0, drop=True) 在groupby调用中使用,因此列as_index=False(您分组的fow)不会添加到索引(创建MultiIndex),因此保留原始索引并且结果可以附加到原始帧。但是,使用L1时,似乎{0.1}}关键字在{0.1}中被忽略。