我是Pandas的新手,来自SQL / SAS背景。我正在尝试从前一个时期获取财务信息并将其合并到我的DataFrame中。这是一个数据示例:
np.random.seed(0)
df = pd.DataFrame({
'company': pd.Series(['A','A','A','B','B','B','C','C','C']),
'year': pd.Series([1,2,3,1,3,4,2,3,4]),
'quarter': pd.Series([2,2,2,3,4,4,1,1,3]),
'amt': np.random.randn(9)
})
我想要的是amt
与company
匹配的前一年的quarter
。这是我在SQL中要做的事情:
SELECT a.*, b.amt as amt_prior
FROM df as a
LEFT JOIN df as b
ON a.company = b.company
AND a.quarter = b.quarter
AND a.year = (b.year + 1);
我想出的是以下内容。它有效,但似乎我没有做Pandas的事情。我有更好的方法吗?
df2 = pd.merge(
df, df,
how='left',
left_on=['company', 'quarter', 'year'],
right_on=['company', 'quarter', np.array(df['year']) + 1],
suffixes=('', '_prior')
)
答案 0 :(得分:3)
您可以使用
<DIV id=win5divInputKeys_bind1>
<INPUT tabIndex=11 id=InputKeys_bind1 class=PSEDITBOX style="WIDTH: 88px" maxLength=11 value=walter name=InputKeys_bind1>
</DIV>
答案 1 :(得分:2)
您可以使用groupby
和transform
+ shift
:
np.random.seed(0)
df
amt company quarter year
0 1.764052 A 2 1
1 0.400157 A 2 2
2 0.978738 A 2 3
3 2.240893 B 3 1
4 1.867558 B 4 3
5 -0.977278 B 4 4
6 0.950088 C 1 2
7 -0.151357 C 1 3
8 -0.103219 C 3 4
priors = df.groupby(['company', 'quarter'])\
.shift().add_suffix('_prior')
priors
amt_prior year_prior
0 NaN NaN
1 1.764052 1.0
2 0.400157 2.0
3 NaN NaN
4 NaN NaN
5 1.867558 3.0
6 NaN NaN
7 0.950088 2.0
8 NaN NaN
现在,将priors
与原始版本连接起来:
df = pd.concat([df, priors], 1)
df
amt company quarter year amt_prior year_prior
0 1.764052 A 2 1 NaN NaN
1 0.400157 A 2 2 1.764052 1.0
2 0.978738 A 2 3 0.400157 2.0
3 2.240893 B 3 1 NaN NaN
4 1.867558 B 4 3 NaN NaN
5 -0.977278 B 4 4 1.867558 3.0
6 0.950088 C 1 2 NaN NaN
7 -0.151357 C 1 3 0.950088 2.0
8 -0.103219 C 3 4 NaN NaN
这与您的预期输出df2
匹配。
您也可以使用Vaishali's solution获得相同的答案,但对同一操作使用2 groupby
s效率不高。