不确定以下内容是否仅适用于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
),因为它会再次按索引对值进行排序。
答案 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()