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

Python 具有非唯一索引的数学运算,python,pandas,Python,Pandas,不确定以下内容是否仅适用于groupby().apply(),但在尝试将数据帧除以具有相同(但非唯一)索引的序列时,我发现以下错误: 我就是这样做到的:我从一个dflike开始 country code patents year POP tcgdp rgdpl 0 Argentina AR 26128 1963 21616.403 23532.842578 5779.541172 1 Argentina

不确定以下内容是否仅适用于
groupby().apply()
,但在尝试将数据帧除以具有相同(但非唯一)索引的序列时,我发现以下错误:

我就是这样做到的:我从一个
df
like开始

     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)
0.14上
。即使
div()
需要唯一的索引,至少
/
运算符或类似运算符应该允许按顺序进行除法-或者我必须将它们重新编码到numpy数组中吗

对代码结构的任何其他评论都是受欢迎的,这些评论应该会随着时间的推移而产生差异


作为我的补充反馈:chrisb
diff()
的评论也适用于本年度
year.iloc[1:]-year.iloc[:-1]
到处返回
0
(还有一个
NaN
),因为它会按索引对值进行再次排序。

如果您只想让这段代码起作用,只需将返回值替换为它,它使用numpy divide函数,该函数将在形状上广播,而不会尝试匹配标记:

np.divide(diff, pd.DataFrame(time_intvall))
还有一件事,这条线

group.iloc[1:][columns] - group.iloc[:-1][columns]
只有在
数据帧中的每个索引都是相同的情况下才会起作用,通常情况下不会,因为数据将按索引对齐。更好的解决方法可能是:

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

似乎你应该在国家和年份上设置索引。但是那样我就无法在我的函数中访问
year
,我需要计算时差。在这种情况下,不要设置索引,使用
df.groupby('country')
或者你可以使用
df.set\u index(['country','year',drop=False)
@ZJS我有设置groupby索引的习惯,因为这使得将
apply()
的结果附加到原始数据帧非常简单。@FooBar,它对我有用,但当我尝试使用不同的形状时却没有。我认为
np.divide(diff,pd.DataFrame(time_intvall))
应该一直有效。如果将序列包装在数据帧中,形状将是
(16,1)
,广播应该有效吗?
diff = group[columns] - group[columns].shift(1)
diff = diff.iloc[1:]  # or diff.dropna()