根据Pandas中其他两列的相等性从列中提取值

时间:2017-09-26 20:26:37

标签: python pandas dataframe

我是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)
})

我想要的是amtcompany匹配的前一年的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')
)

2 个答案:

答案 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)

您可以使用groupbytransform + 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效率不高。