为什么我在pandas中的apply / assign函数中得到一个系列

时间:2017-10-16 23:52:21

标签: python pandas dataframe lambda

我有一个国家和人口的词汇:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html">

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />        
        <meta http-equiv="refresh" content="30">
        <title><ui:insert name="title">Default Title</ui:insert></title>
        <h:outputStylesheet library="css" name="jsfcrud.css"/>
    </h:head>

    <h:body>
        <h1>
            <ui:insert name="title">Default Title</ui:insert>
        </h1>
        <p>
            <ui:insert name="body">Default Body</ui:insert>
        </p>
    </h:body>

</html>

在我的df(sort_countries)中,我有一个名为country的列,我想在上面的字典中添加另一个名为population的列(匹配具有填充的国家/地区)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">           
    <ui:composition template="/template.xhtml">
        <ui:define name="title">
            <h:outputText value="#{bundle.ListPhonerecordTitle}"></h:outputText>
        </ui:define>
        <ui:define name="body">                   
            <h:form styleClass="jsfcrud_list_form">
                <p:poll interval="10" listener="#{phonerecordController.prepareList}" update="@all" />
                ...
                ...
                ...                
            </h:form>
        </ui:define>
    </ui:composition>

</html>

给出错误:population_dict = {"Germany": 1111, .... }

为什么population_df = sort_countries.assign( population=lambda x: population_dict[x["country"]], axis = 1) population_df.head() 是一个系列,当我想象它应该只返回国家的名称。

这只熊猫总是让我感到困惑。在我的lambdas中,我希望x是一行,我只从该行中选择国家。相反,len(x [&#34; country&#34;])给了我192(我的国家的数量,整个系列)。

我如何使用lambdas匹配它们而不是单独的函数? 谢谢!

2 个答案:

答案 0 :(得分:1)

请注意x["country"]Series,虽然是单个元素,但这不能用于索引字典。如果您只想要与之关联的值,请使用x["country"].item()

然而,为此类事情量身定制的更好方法是使用df.map

population_df["population"] = population_df["country"].map(population_dict)

map会自动映射从population_df [&#34; country&#34;]中获取的密钥,并将其映射到population_dict中的相应值。

答案 1 :(得分:0)

另外:

{ _id: "LOCATION:GOOD:CATALOG" // unique by itself, repeating catalog to ensure unique, used for fast reads _catalog: "..." // unique by itself, used for fast writes in_stock: 0|1 in_catalog: 0|1 } createIndex( { "_id": 1, "_catalog": 1 }, { unique: true } )

的工作原理。 或者:

population_df["population"] = population_df.apply(lambda x: population_dict[x["country"]], axis=1)