Python / Pandas - 基于列比较构建新列

时间:2017-06-22 20:24:56

标签: python pandas

我有这个数据框:

df:
                    CNPJ     Revenues 2016    Revenues 2015     Revenues 2014
0     01.637.895/0001-32     R$ 12.696.658              NaN     R$ 10.848.213   
1     02.916.265/0001-60               NaN   R$ 162.914.526    R$ 142.412.432
2     02.932.074/0001-91               NaN              NaN      R$ 1.928.312
3     03.853.896/0001-40     R$ 19.333.453    R$ 18.891.833     R$ 12.645.986

每行代表一家公司,每个“收入”列代表公司参考年度的收入。

我想创建一个名为“last_revenues”的新列,它将具有收入的最后一个值。如果2016年是我们最后的2016年,那么2016年,如果我们没有2016年,但2015年,2015年将是一个。如果我们既没有2016年或2015年,则last_revenues将具有2014年的价值。

它必须如下所示:

                    CNPJ     last_revenues
0     01.637.895/0001-32     R$ 12.696.658
1     02.916.265/0001-60    R$ 162.914.526
2     02.932.074/0001-91      R$ 1.928.312
3     03.853.896/0001-40     R$ 19.333.453

有人可以提出一种方法吗?

2 个答案:

答案 0 :(得分:3)

df1 = df.set_index('CNPJ')
df1['last_revenues'] = df1.fillna(method='bfill',axis=1).iloc[:,0]

或者DSM建议我们可以将其缩短为

df1['last_revenues'] = df1.bfill(axis=1).iloc[:,0]
df1.reset_index()

输出:

                 CNPJ  Revenues 2016   Revenues 2015   Revenues 2014  \
0  01.637.895/0001-32  R$ 12.696.658             NaN   R$ 10.848.213   
1  02.916.265/0001-60            NaN  R$ 162.914.526  R$ 142.412.432   
2  02.932.074/0001-91            NaN             NaN    R$ 1.928.312   
3  03.853.896/0001-40  R$ 19.333.453   R$ 18.891.833   R$ 12.645.986   

    last_revenues  
0   R$ 12.696.658  
1  R$ 162.914.526  
2    R$ 1.928.312  
3   R$ 19.333.453  

答案 1 :(得分:1)

您可以使用df['last_revenues'] = df['Revenues 2016'].fillna(df['Revenues 2015']).fillna(df['Revenues 2014']) 2次:

<mule>
    <spring:beans>
        <spring:bean id="foo" name="foo" class="java.lang.String">
            <spring:constructor-arg value="this is foo." />
        </spring:bean>
    </spring:beans>

    <flow name="test-flow">
        <set-payload value="#[app.registry.foo]" doc:name="Set Payload"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload>
<![CDATA[%dw 1.0
%output application/xml
---
{
    foo: payload
}]]>
</dw:set-payload>
        </dw:transform-message>
    </flow>
</mule>