【发布时间】:2017-12-20 18:17:05
【问题描述】:
我需要根据第二个数据框的属性向现有的 pandas 数据框添加一列。我做了一个最小的例子来说明我的确切要求。
我有两个数据框,一个代表姓名对,另一个代表两个人之间的交互:
>>> names
id_a id_b
0 ben jack
1 jack ben
2 jill amir
3 wilma jill
4 amir wilma
>>> interactions
individual1 individual2
0 jill jack
1 jack jill
2 wilma jill
3 amir jill
4 amir jack
5 jack amir
6 jill amir
我需要的基本上是这样的:对于names 中的每一对名称,我需要计算这两个名称之间的交互次数,因此interactions 中的行数names['id_a'] 是interactions['individual1'] 或 interactions['individual2'] AND names['id_b'] 是 interactions['individual1'] 或 interactions['individual2']。对于名称中的所有行,此计数需要包含在列 num_interactions 中,即使名称是重复的(即,如果有一行 id_a 是 ben 并且 id_b 是 jack 并且这些名称是颠倒的( id_a 是 jack,id_b 是 ben),这两行都应该包含 num_interactions)
生成的数据框如下所示:
>>> names
id_a id_b num_interactions
0 ben jack 0.0
1 jack ben 0.0
2 jill amir 2.0
3 wilma jill 1.0
4 amir wilma 0.0
enter code here
我做了什么
这很好用,但它很难看、难以阅读、效率低下,而且我知道一定有更好的方法!也许有某种合并,但我真的不知道如何使用复杂的标准......
for i in range(len(names)):
names.loc[i, 'num_interactions'] = len(
interactions[((interactions['individual1'] == names.loc[i, 'id_a']) &
(interactions['individual2'] == names.loc[i, 'id_b'])) |
((interactions['individual2'] == names.loc[i, 'id_a']) &
(interactions['individual1'] == names.loc[i, 'id_b']))
])
重现我的示例数据框
如果你想玩这个,你可以用它来重现我上面的虚拟数据帧。
import pandas as pd
names = pd.DataFrame(data={'id_a': ['ben', 'jack', 'jill', 'wilma', 'amir'],
'id_b': ['jack', 'ben', 'amir', 'jill', 'wilma']})
interactions = pd.DataFrame(data={'individual1': ['jill', 'jack',
'wilma', 'amir',
'amir', 'jack', 'jill'],
'individual2': ['jack', 'jill', 'jill',
'jill', 'jack', 'amir',
'amir']})
提前致谢!
【问题讨论】:
-
类似
names['num_interactions'] = interactions.groupby(['individual1 ','individual2']).transform('count')? -
@LucasDresl 不幸的是,这无法处理成对之间的不同顺序。