我需要根据第二个数据框的属性向现有的熊猫数据框添加一列。我做了一个最小的例子来说明我的确切要求。

我有两个数据框,一个代表成对的名称,另一个代表两个人之间的交互:

    >>> 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中的每对名称,我需要计算这两个名称之间的交互次数,因此interactionsnames['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/

10-12 23:31
查看更多