2番目のデータフレームの属性に基づいて既存のpandasデータフレームに列を追加する必要があります。私は私の正確な要件を示すために最小限の例を作りました。別のデータフレームに基づいてPandasで新しい列を作成
私は2つのデータフレームを持っている、名前のペアを表す1つ、そして二人の個人間の相互作用を表す他は:
>>> 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
の名前の各ペアについて、Iこれらの2つの名前の間の対話数をカウントする必要があるので、names['id_a']
の中の行数はまたはinteractions['individual2']
とnames['id_b']
のいずれかで、行数はinteractions['individual1']
またはinteractions['individual2']
のいずれかです。名前が重複していても(ID_aがbenであり、id_bがジャックである行と、その名前が逆になっている行(id_aは次のようになります)場合でも、このカウントは名前のすべての行について列num_interactions
に含める必要があります。ジャックとID_Bベンである)、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']})
ありがとうございます!
'名前['num_interactions'] = interactions.groupby(['individual1'、 'individual2'])。transform( 'count')'? –
@LucasDreslそれは、残念ながら、ペアの間で変化する順序を処理しません。 –