具有非唯一索引的数学运算

时间:2014-08-22 14:20:19

标签: python pandas

不确定以下内容是否仅适用于groupby().apply(),但当我尝试将数据帧除以系列时,如果两者具有相同(但非唯一)的索引,则会发生以下错误:

ValueError: cannot reindex from a duplicate axis

这就是我到达那里的方式:我开始使用df之类的

     country code  patents  year        POP         tcgdp        rgdpl 
0  Argentina   AR    26128  1963  21616.403  23532.842578  5779.541172   
1  Argentina   AR    21296  1964  21949.244  26581.915354  6163.149818   
2  Argentina   AR    20656  1965  22283.100  30364.930885  6692.229491   
3  Argentina   AR    18058  1966  22611.604  30579.084323  6607.346553   
4  Argentina   AR    15632  1967  22934.225  32721.004053  6710.778328

并做

df = df.sort(['country', 'year'])
df.set_index(['country'], inplace=True)

def create_diffs(group, columns):
    diff = group.iloc[1:][columns] - group.iloc[:-1][columns]
    time_intvall = group.iloc[1:]['year'] - group.iloc[:-1]['year']
    return diff.div(time_intvall)

columns = ['patents', 'POP', 'tcgdp', 'rgdpl']
df.groupby(level=0).apply(create_diffs, columns)
<{1>} pandas 0.14。即使div()需要唯一索引,至少/运算符或类似运算符应允许按顺序进行除法 - 或者我是否必须将这些转换为numpy数组?

欢迎任何其他关于代码结构的评论,这应该会随着时间的推移产生差异。

作为我自己的额外反馈 chrisb diff()的评论也适用于这一年。 year.iloc[1:] - year.iloc[:-1]在任何地方都返回0(以及一个NaN),因为它会再次按索引对值进行排序。

1 个答案:

答案 0 :(得分:2)

如果你只想让这段代码工作,只需用这个替换return,它使用numpy divide函数,它将在形状上广播而不是试图匹配指标:

np.divide(diff, pd.DataFrame(time_intvall))

另一件事,这一行

group.iloc[1:][columns] - group.iloc[:-1][columns]

只有工作才会发生,因为group数据帧中的每个索引都是相同的,通常它不会,因为这些数据将按索引对齐。怀疑这个的更好方法可能是:

diff = group[columns] - group[columns].shift(1)
diff = diff.iloc[1:]  # or diff.dropna()