【问题标题】:Creating a dataframe columns with lists of matching values from another dataframe使用来自另一个数据框的匹配值列表创建数据框列
【发布时间】:2019-05-09 03:45:14
【问题描述】:

我正在尝试创建一个 pandas 数据框列(在 df1 中),其中每个元素都是另一个数据框 (df2) 中与 df1 中现有列匹配的所有值的列表。这与 pandas 左合并不同,因为每次 df1 值在 df2 中重复时,该函数都会创建新行。

我的代码完全符合我的需要,但它非常慢(在我的大型数据帧上),我几乎可以肯定有一个内置的 pandas 方法可以做我正在寻找的事情,但我没有没能找到。

这是我当前代码的简化版本。

import pandas as pd
df1=pd.DataFrame({'col4': [1,2,3,4,5,6]})
df2=pd.DataFrame({'col2':['a','b','c','d','e','f','g'],'col3':[1,1,2,3,4,4,6]})
df1['col1']=pd.Series(list(df2['col2'][df2['col3']==df1['col4'][i]]) for i in df1.index)

有没有办法使用 pandas apply 方法或类似的方法来执行此操作,而不是遍历 df1.index?谢谢!

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    试试:

    df1.set_index('col4', inplace=True)
    df1['col4'] = df2.groupby('col3').col2.apply(list)
    df1.reset_index(drop=True, inplace=True)
    

    【讨论】:

      【解决方案2】:

      这实际上是merge 问题,但是您还需要groupby 并从组中创建列表:

      (df1.merge(df2, left_on='col4', right_on='col3', how='right')
          .groupby('col3').col2
          .apply(list))
      
            col3
      1    [a, b]
      2       [c]
      3       [d]
      4    [e, f]
      6       [g]
      Name: col2, dtype: object
      

      【讨论】:

        【解决方案3】:

        这可能会帮助您完成大部分工作,但我相信由于尝试将列表存储在 DataFrame 中,效率低下可能仍然存在。我认为您可能想研究 MultiIndex,但我不确定您的用例是什么。

        import pandas as pd
        df1 = pd.DataFrame({'col4': [1,2,3,4,5,6]})
        df2 = pd.DataFrame({'col2':['a','b','c','d','e','f','g'],'col3':[1,1,2,3,4,4,6]})
        result = df1.join(df2.groupby('col3').agg(list), on='col4')
        

        【讨论】:

          猜你喜欢
          • 2020-09-11
          • 1970-01-01
          • 2020-04-11
          • 1970-01-01
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 1970-01-01
          相关资源
          最近更新 更多