Pandas: 将数据帧的单元格与不同列的内容进行比较并复制相邻数据
Pandas: Comparing cell of a dataframe to content of different column & copying neighboring data
我想遍历数据框 A 的列,对于每个单元格,检查其内容是否与数据框 B 中列的任何单元格匹配。如果匹配,我想复制同一列的另一列的内容数据框 B 中的行到数据框 A 中匹配单元格行中的新列。
示例:
dataframe_a
姓名 |年龄
布拉德 | 36
梅艳芳 | 54
布拉德 | 23
玛丽 | 34
dataframe_b
first_name |性别
艾米 | f
梅艳芳 | f
本 |米
贝拉 | f
本 |米
布拉德 |米
弗洛里安 |米
玛丽 | f
...
目标:dataframe_a
姓名 |年龄 |性别
布拉德 | 36 |米
梅艳芳 | 54 | f
玛丽 | 34 | f
到目前为止,这就是我所拥有的
if (dataframe_a['name'].iteritems() == dataframe_b['first_name]:
dataframe_b['gender'] = dataframe_a['gender']
但是,我得到 "ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."。我猜我必须在这里放一个循环,但那太慢了,我很确定一定有更快的方法吗?
试试这个:
df1.merge(df2.rename(columns={'first_name':'name'}))
输出:
name age gender
0 Brad 36 m
1 Anita 54 f
2 Mary 34 f
你也可以用字典来做到这一点:
gender_map = dataframe_b.set_index('first_name').to_dict()['gender']
dataframe_a['gender'] = dataframe_a.set_index('name').index.map(gender_map)
gender_map:
{'Amy': 'f',
'Anita': 'f',
'Ben': 'm',
'Bella': 'f',
'Brad': 'm',
'Florian': 'm',
'Mary': 'f'}
name age gender
0 Brad 36 m
1 Anita 54 f
2 Mary 34 f
我想遍历数据框 A 的列,对于每个单元格,检查其内容是否与数据框 B 中列的任何单元格匹配。如果匹配,我想复制同一列的另一列的内容数据框 B 中的行到数据框 A 中匹配单元格行中的新列。
示例:
dataframe_a
姓名 |年龄
布拉德 | 36
梅艳芳 | 54
布拉德 | 23
玛丽 | 34
dataframe_b
first_name |性别
艾米 | f
梅艳芳 | f
本 |米
贝拉 | f
本 |米
布拉德 |米
弗洛里安 |米
玛丽 | f
...
目标:dataframe_a
姓名 |年龄 |性别
布拉德 | 36 |米
梅艳芳 | 54 | f
玛丽 | 34 | f
到目前为止,这就是我所拥有的
if (dataframe_a['name'].iteritems() == dataframe_b['first_name]:
dataframe_b['gender'] = dataframe_a['gender']
但是,我得到 "ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."。我猜我必须在这里放一个循环,但那太慢了,我很确定一定有更快的方法吗?
试试这个:
df1.merge(df2.rename(columns={'first_name':'name'}))
输出:
name age gender
0 Brad 36 m
1 Anita 54 f
2 Mary 34 f
你也可以用字典来做到这一点:
gender_map = dataframe_b.set_index('first_name').to_dict()['gender']
dataframe_a['gender'] = dataframe_a.set_index('name').index.map(gender_map)
gender_map:
{'Amy': 'f',
'Anita': 'f',
'Ben': 'm',
'Bella': 'f',
'Brad': 'm',
'Florian': 'm',
'Mary': 'f'}
name age gender
0 Brad 36 m
1 Anita 54 f
2 Mary 34 f