【问题标题】:Extract element from pandas list-series and store as separate series从熊猫列表系列中提取元素并存储为单独的系列
【发布时间】:2021-01-14 00:12:09
【问题描述】:

我有这个 df(带有示例所需的结果)

dfn = pd.DataFrame({"country_code": ["USA, UK, FRA", "RUS, ZHC, JAP", "IN, BRA, ES"], 
                    "all_but_american_desired": [["United Kingdom", "France"], ["Russia", "China", "Japan"], ["India", "Spain"]]})

我将(到目前为止)字符串“翻译”成新的含义并存储为元素列表

masked = {"USA":"United States", "UK":"United Kingdom", "FRA":"France", 
          "RUS":"Russia", "ZHC":"China", "JAP":"Japan", 
          "IN":"India", "BRA":"Brazil", "ES":"Spain"}

dfn["country_name"] = dfn["country_code"].apply(lambda x: [", ".join({masked[i] for i in x.split(", ")})])

然后我想通过外部列表american提取一些已翻译的国家/地区名称系列并将它们放在单独的系列中 (all_but_american)

american = ["United States", "Brazil"]

结果应与all_but_american_desired 系列相同。到目前为止我尝试过的:

dfn["all_but_american1"] = dfn["country_name"].apply(lambda x: [i for i in x if i not in american])

我之前使用了尝试1非常相同的方法并且它有效,但是这次没有任何工作,我找不到它的原因(这次我也尝试了其他方法,但因为我不熟悉与他们一起,我将避免发布)...有人可以检查一下吗?如果可能的话,解释一下我做错了什么。

【问题讨论】:

    标签: python pandas list extract expand


    【解决方案1】:

    对于country_name,创建列表而不是一个带有连接值的元素列表:

    dfn["country_name"] = dfn["country_code"].apply(lambda x: [masked[i] for i in x.split(", ")])
    

    然后您的第二个解决方案运行良好:

    american = ["United States", "Brazil"]
    
    dfn["all_but_american1"] = dfn["country_name"].apply(lambda x: [i for i in x if i not in american])
    print (dfn)
        country_code  all_but_american_desired  \
    0   USA, UK, FRA  [United Kingdom, France]   
    1  RUS, ZHC, JAP    [Russia, China, Japan]   
    2    IN, BRA, ES            [India, Spain]   
    
                                  country_name         all_but_american1  
    0  [United States, United Kingdom, France]  [United Kingdom, France]  
    1                   [Russia, China, Japan]    [Russia, China, Japan]  
    2                   [India, Brazil, Spain]            [India, Spain]  
    

    【讨论】:

    • 英雄!一如既往的有效答案。谢谢@jezrael!我很好奇,如果你愿意的话,是否有可能在 country_name 系列的创建过程中将其“提取”和“分解”成一个单独的系列,其中仅包含美国列表中的项目?而不是“从头开始”创建它?我不确定它的 Pythonic 或效率如何(可能不是很多),但想看看它是什么样子(lambda 或常规函数)
    • 不,我是说,不是使用该 lambda 创建“all_but_american”,而是在我们创建“country_name”的同一行上创建它,如果结果列表来自蒙面,则使其“扩展”元素包括“美国”列表中的元素。如果太难解释,那肯定不是很 Python,但听起来像是一个很好的实验 :)
    • 关闭 - 结果与当前的all_but_american1 相同,只是绕过了country_name 系列的创建。我要说的是,不是完全过滤掉american 元素,而是“提取”/“分解”这些元素以存储在另一个系列中。 Off-topic-ish:还想知道是否有办法将列表系列的最后一个元素(例如country_name)添加到另一个列表系列(例如all_but_american1),如果它们满足某些标准。因此,例如,如果该元素 == "Japan",则将 country_name[-1] 添加到 all_but_american1
    • @cjcrm - 我认为最好的创建新问题 - 首先是可能使用 dfn["all_but_american1"] = dfn["country_name"].apply(lambda x: [i for i in x if i not in american])dfn["all_american1"] = dfn["country_name"].apply(lambda x: [i for i in x if i in american]) 或附加到 2 个列表的自定义函数
    • 是的,拆分问题是有意义的。再次,非常感谢@jezrael,非常感谢!
    猜你喜欢
    • 2020-06-20
    • 1970-01-01
    • 2018-02-09
    • 2018-07-11
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多