如何匹配两个 DataFrame 中的特定值并在 Python Pandas 中添加额外的列? [复制]

Posted

技术标签:

【中文标题】如何匹配两个 DataFrame 中的特定值并在 Python Pandas 中添加额外的列? [复制]【英文标题】:How to Match Specific Values in two DataFrames and Add Extra Columns in Python Pandas? [duplicate] 【发布时间】:2019-07-24 11:51:43 【问题描述】:

如何使用 FOR LOOP 将 df_students 中的颜色与 df_colors 中的颜色进行匹配,然后在 df_students 中为每个学生填写对应的fruit和对应的fruit_id?

import pandas as pd
df_colors = pd.DataFrame('fruit_id':[101, 102, 103, 104, 105, 106, 107, 108, 109],
                       'fruit':['apple','banana','dragonfruit','kiwi','plum','lime', 'blackberry', 'blueberry', 'guava'],
                       'color':['red', 'yellow', 'magenta', 'brown', 'purple', 'green', 'black', 'blue', 'pink'])

df_students = pd.DataFrame('student':['Jamie', 'Tao', 'Ingrid', 'Will', 'Boris','Xavier','Nancy', 'Judith', 'Lamar', 'Francis', 'Shawna', 'Carlos', 'Morgan'],
                        'color': ['black', 'red', 'magenta', 'yellow','black', 'magenta', 'brown', 'purple', 'magenta', 'green', 'blue', 'pink', 'pink'])


df_students['fruit'] = ''
df_students['fruit_id'] = ''
for eachstudent in df_students['color']:
    for acolor in df_colors['color']:
        if eachstudent == acolor:
            df_students['fruit'] = df_colors['fruit']
            df_students['fruit_id'] = df_colors['fruit_id']
df_students

这个输出不正确!

【问题讨论】:

您的数据没有意义?如果df_colors中的苹果是红色,红色和香蕉是一样的,黑色和苹果如何搭配? @Erfan 上面的代码输出错误。你可能是对的,我可以指出这一点。感谢您的建议! @Guy_Fuqua 我已经更新了两种解决方案,一种用于 for 循环(用于合并),另一种显示在问题上。 【参考方案1】:
import pandas as pd

df_colors = pd.DataFrame('fruit_id':[101, 102, 103, 104, 105, 106, 107, 108, 109],
                   'fruit':['apple','banana','dragonfruit','kiwi','plum','lime', 'blackberry', 'blueberry', 'guava'],
                   'color':['red', 'yellow', 'magenta', 'brown', 'purple', 'green', 'black', 'blue', 'pink'])

df_students = pd.DataFrame('student':['Jamie', 'Tao', 'Ingrid', 'Will', 'Boris','Xavier','Nancy', 'Judith', 'Lamar', 'Francis', 'Shawna', 'Carlos', 'Morgan'],
                    'color': ['black', 'red', 'magenta', 'yellow','black', 'magenta', 'brown', 'purple', 'magenta', 'green', 'blue', 'pink', 'pink'])
df_students['fruit'] = ''
df_students['fruit_id'] = ''

for acolor1 in df_colors['color']: 
    df_students.loc[df_students['color']==acolor1,'fruit']= list(df_colors.loc[df_colors['color']==acolor1,'fruit'])[0]
    df_students.loc[df_students['color']==acolor1, 'fruit_id'] = list(df_colors.loc[df_colors['color']==acolor1, 'fruit_id'])[0]
print (df_students)

【讨论】:

完美。非常感谢! 最后的[0]表示什么? df_students.loc[df_students['color']==acolor1,'fruit']= list(df_colors.loc[df_colors['color']==acolor1,'fruit'])[0] 表示它是列表的第一个成员【参考方案2】:

这个怎么样:

for num1,eachstudent in enumerate(df_students['color']):
    for num2,acolor in enumerate(df_colors['color']):
        if eachstudent == acolor:
            df_students['fruit'].values[num1] = df_colors['fruit'].values[num2]
            df_students['fruit_id'].values[num1] = df_colors['fruit_id'].values[num2]

【讨论】:

感谢人这也有效。【参考方案3】:

你只是想执行一个合并,你不需要'for循环'。

请看Pandas Merging 101

您正在寻找的解决方案:

df_students.merge(df_colors, on='color', how='left')


    student color   fruit_id    fruit
0   Jamie   black   107         blackberry
1   Tao     red     101         apple
2   Ingrid  magenta 103         dragonfruit
3   Will    yellow  102         banana
4   Boris   black   107         blackberry
5   Xavier  magenta 103         dragonfruit
6   Nancy   brown   104         kiwi
7   Judith  purple  105         plum
8   Lamar   magenta 103         dragonfruit
9   Francis green   106         lime
10  Shawna  blue    108         blueberry
11  Carlos  pink    109         guava
12  Morgan  pink    109         guava

就像我说的,如果您想在两个数据框中的 color 列上进行匹配,那么您给出的预期输出是不正确的。

【讨论】:

你说得对。我有合并解决方案,我对专门针对项目的 for 循环解决方案感兴趣。

以上是关于如何匹配两个 DataFrame 中的特定值并在 Python Pandas 中添加额外的列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

比较一个结构的两个值并在 UITableView swift 4.0 中获取额外的单元格

如何在值列中搜索特定值并在 Big Query SQL 中替换为该特定值?

每天获取一个非常大的 Pandas DataFrame 中所有行的总和,这些行在两个特定列中匹配

如何访问数组类型值并在两个不同的列中设置火花?

查找两个不同数据框列之间的部分匹配,并在找到匹配时分配值

R语言vtreat包自动处理dataframe的缺失值并生成对应的数据列_isbad来指示数据的原始缺失情况查看特定字段缺失的那些数据行查看数据集中多个字段的均值