如何匹配两个 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来指示数据的原始缺失情况查看特定字段缺失的那些数据行查看数据集中多个字段的均值