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()