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

15 python pandas

我开始学习熊猫了,我在这里提出了这个问题并且无法让解决方案为我工作而且我得到索引错误.这就是我所拥有的

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())
Run Code Online (Sandbox Code Playgroud)

输出以下内容(我正在使用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
Run Code Online (Sandbox Code Playgroud)

然后,我尝试在帖子中建议的标签"new"下附加累积数字计算

df["new"] = df.groupby("L1", as_index=False).apply(lambda x : pd.expanding_sum(x.sort("L3", ascending=False)["L3"])/x["L3"].sum())
Run Code Online (Sandbox Code Playgroud)

我明白了:

   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
Run Code Online (Sandbox Code Playgroud)

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

jor*_*ris 19

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

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

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

虽然计算列的索引是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)]
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

在pandas 0.13(开发中)中,这是固定的(https://github.com/pydata/pandas/pull/4670).由于这个原因,as_index=False它在groupby调用中使用,因此列L1(您组合的fow)不会添加到索引(创建MultiIndex),因此保留原始索引并将结果附加到原始帧.但是as_index在使用时似乎忽略了关键字0.12 apply.

  • 旁白:我认为`df = df.sort(["L1","L3"],升序= [真,假]); df ["new"] = df.groupby("L1")["L3"].transform(lambda x:x.cumsum()/ x.sum())`看起来有点干净. (4认同)