【问题标题】:Pandas DataFrame Comprehensions [duplicate]Pandas DataFrame 理解 [重复]
【发布时间】:2019-04-23 19:43:29
【问题描述】:

问题:在类似于列表推导的一行代码中,根据条件,将新列添加到 DataFrame 并使用来自另一个 DataFrame 的列的值填充。

示例代码:

我用一些瞳孔信息创建了一个名为 df 的 DataFrame

data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
        'year': [2012, 2012, 2013, 2014, 2014], 
        'reports': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 
        'Maricopa', 'Yuma'])

然后是名为 df_extra 的第二个 DataFrame,它具有年份的字符串表示:

extra_data = {'year': [2012, 2013, 2014],
       'yr_string': ['twenty twelve','twenty thirteen','twenty fourteen']}
df_extra = pd.DataFrame(extra_data)

现在如何将值 yr_string 作为新列添加到 df 中,其中数字年份在一行代码中匹配?

我可以通过几个 for 循环轻松做到这一点,但我真的很想知道这是否可以在一行中完成,类​​似于列表推导?

我已经在这里搜索过问题,但是没有讨论根据一行中的条件从另一个 DataFrame 向现有 DataFrame 添加新列。

【问题讨论】:

    标签: python pandas dataframe list-comprehension


    【解决方案1】:

    您可以merge年列上的数据框。

    df.merge(df_extra, how='left', on=['year'])
    #     name  reports  year        yr_string
    # 0  Jason        4  2012    twenty twelve
    # 1  Molly       24  2012    twenty twelve
    # 2   Tina       31  2013  twenty thirteen
    # 3   Jake        2  2014  twenty fourteen
    # 4    Amy        3  2014  twenty fourteen
    

    基本上,这表示“将数据从df_extra 拉到dfyear 列与df 匹配的任何位置”。 请注意,这将返回一个副本,而不是就地修改数据框。

    列表推导仍然是 Python 循环(在技术上可能并不完全准确)。使用 pandas.merge() 方法,您可以利用 Pandas 用于操作其数据帧的矢量化、优化的后端代码。应该更快。

    【讨论】:

    • 如何就地修改?将此合并分配给原始 df 或设置 copy=False?根据文档 copy=False 不能保证避免复制
    • 我认为你不能在 Pandas 中进行就地合并。您只需将输出分配给新数据框或返回df 并从那里开始。
    • 是的,一直在玩这个。当我尝试分配回 df 时,它不包括合并。有一个论点“复制”似乎没有做任何有用的事情。我已经创建了一个关于此的问题,因为我想避免最终在内存中使用多个 DataFrame
    • 您可以在一行中执行merged_df = df.merge(...) 之类的操作,然后执行del dfdel df_extra 之类的操作以释放内存。如果它们足够大以至于您无法在内存中存储那么多,那么是的,这是另一个问题:P
    猜你喜欢
    • 2014-07-16
    • 2020-01-03
    • 2021-09-03
    • 2016-11-24
    • 1970-01-01
    • 2018-01-09
    • 2020-11-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多