我需要根据第二个数据框的属性向现有的熊猫数据框添加一列。我做了一个最小的例子来说明我的确切要求。
我有两个数据框,一个代表成对的名称,另一个代表两个人之间的交互:
>>> 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']})
提前致谢!
最佳答案
假设顺序无关紧要,则可以按列对每个数据框进行排序。对于第二个数据框,计算与groupby
+ count
进行的每组交互,然后对结果和第一个数据框执行左外部merge
。
i = pd.DataFrame(np.sort(names, axis=1))
j = pd.DataFrame(np.sort(interactions, axis=1))
k = j.groupby(j.columns.tolist())[0].count().reset_index(name='count')
df = i.merge(k, on=[0, 1], how='left')\
.fillna(0)\
.rename(columns={0 : 'id_a', 1 : 'id_b'})
df.iloc[:, :2] = names.values
df
id_a id_b count
0 ben jack 0.0
1 ben jack 0.0
2 amir jill 2.0
3 jill wilma 1.0
4 amir wilma 0.0
关于python - 根据另一个数据框在Pandas中创建新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47912110/