我开始学习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”降序。)
答案 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}中被忽略。