当前位置: 首页 > 知识库问答 >
问题:

熊猫,使用另一个数据帧值在数据帧中找到匹配的关键字

公羊宗清
2023-03-14

我有2个熊猫数据框

df1=

        student              courses
    0  student1   Math, Science, Gym
    1  student2  gym, Geography, Art
    2  student3            Chemistry
    3  student4   Art, math, physics
    4  student5     biology, history
    5  student6          Robotics

df2=

                     class  weight
    0                 math    9.00
    1              science    8.00
    2                  gym    4.00
    3            geography    6.00
    4                  art    7.00
    5            chemistry    8.50
    6              physics   10.00
    7              biology    9.00
    8              history    7.50
    9           Philosophy    9.00
   10   Physical Chemistry   10.00
   11     Computer Science    8.75

我想使用df2“类”列中的可能值搜索df1中的“课程”列,然后返回适当的合计权重。

这是我目前所知道的

#extract courses
class_list = df2['class'].values.tolist()
class_list_regex= ['\\b%s\\b' % x for x in class_list]
class_list_pattern = '|'.join(class_list_regex)

final_df = df1['courses'].str.findall('('+class_list_pattern+ ')',flags=re.IGNORECASE)

导致

0     [Math, Science, Gym]
1    [gym, Geography, Art]
2              [Chemistry]
3     [Art, math, physics]
4       [biology, history]
Name: courses, dtype: object

我怎样才能得到这样的东西

    student        matched_courses      total weight
    0  student1   [Math, Science, Gym]          21.0
    1  student2  [gym, Geography, Art]          17.0
    2  student3            [Chemistry]           8.5
    3  student4   [Art, math, physics]          26.0
    4  student5     [biology, history]          16.5
    5  student6                     []           0.0

任何帮助都将不胜感激。谢谢

共有1个答案

史和泰
2023-03-14

试试这个解决方案

import re
from sklearn.preprocessing import MultiLabelBinarizer

df1["courses"] = df1["courses"].apply(lambda x: re.sub('\s+', '', str(x).lower()).split(","))
mlb = MultiLabelBinarizer()
course_dummies = pd.DataFrame(mlb.fit_transform(df1["courses"]),columns=mlb.classes_, index=df1.index)
course_dummies_t=course_dummies.T.reset_index()
course_dummies_t=course_dummies_t.rename(columns={"index":"class"})
merge = pd.merge(course_dummies_t,df2,on="class",how="left")

df1["total weight"]=merge[range(0,6)].multiply(merge["weight"], axis="index").sum(axis=0)
 类似资料:
  • 我有两个Pandas Dataframe和,其中是的一部分,我想创建一个Dataframe,其中包含中的code>。 以下是一个例子: 注: 我的DataFrame可能有多个列,但是必须仅在列上进行匹配。

  • 我有两个Dataframes一个与日期集(df1)和另一个与emp_ids集(df2)。我试图创建一个新的Dataframe,这样df2中的每个emp_id都被标记为df1中的每个日期。 下面给出了我的数据帧的外观 df1 df2 预期产出: 我将日期列转换为字符串,并尝试执行以下操作,但返回的数据框为空 我尝试做

  • 我有两个具有多列的数据帧。 我想比较df1['id']和df2['id'],并返回一个新的df,其中列['correct_id']具有匹配值。例子: df1: df2 这是我的代码: 我得到的结果是: 预期输出: 我该怎么解决这个问题拜托

  • 我有点被困在提取一个变量的值和另一个变量的条件上。例如,以下数据帧: 当时,如何获取的值?每次提取的值时,都会得到一个对象,而不是字符串。

  • 我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例

  • 我有两个数据帧,都有一个键列,可能有重复项,但数据帧大部分都有相同的重复键。我希望在该键上合并这些数据帧,但这样做的方式是,当两者具有相同的副本时,这些副本将分别合并。此外,如果一个数据帧的键的副本比另一个多,我希望它的值填充为NaN。例如: 我正在尝试获得以下输出 所以基本上,我想把复制的K2键当作K2_1,K2_2。。。然后在数据帧上进行how='outer'合并。你知道我怎样才能做到这一点吗