データフレームデータが1つあります
groupId service local
0 1 s1 l1
1 1 s1 l1
2 1 s2 l2
3 1 s3 l3
4 2 s2 l2
5 2 s3 l3
6 3 s1 l1
7 3 s2 l2
データフレームに関する質問があります
q1 q2 howManyGroups
0 s1 l1 0
1 s1 s2 0
2 s2 l2 0
3 s3 l3 0
4 s3 l1 0
表示されるデータ内のグループの数に基づいて、質問行の発生をカウントしたいと思います。
q1 q2 howManyGroups
0 s1 l1 2
1 s1 s2 2
2 s2 l2 3
3 s3 l3 2
4 s3 l1 1
私はこのコードを使用していますが、本当に遅いです:
for i,g in data.groupby('groupId'):
for j,r in question.iterrows():
if set(r[['q1','q2']].values).issubset(set( g.drop('groupId', axis=1).values.ravel())):
question.loc[j,'howManyGroups'] += 1
編集:私の質問データフレームには、より多くの/より少ない列が含まれる場合がありq1 and q2
ます。ある場合はそれだけq1
、ある場合はあるq1, q2, q3
...
最初にデータを再形成して、groupIdごとに行を取得し、任意の列サービスまたはローカルで一意の値を取得することができます。
data_ = (data.set_index('groupId').stack()
.reset_index(name='h')
[['groupId', 'h']].drop_duplicates()
)
print (data_.head())
groupId h
0 1 s1
1 1 l1
4 1 s2
5 1 l2
6 1 s3
次に、質問とmerge
2回を使用します。1回目はq1(およびdata_のh)でのみ、どのgroupIdがq1に関連付けられているかを取得し、2回目はq2とgroupIdで、q1とq2の両方が同じグループにあることを確認します。最後groupby
に、マージしてgroupIdで使用する前にreset_indexで保持した元のインデックスnunique
:
question['howManyGroups'] = (question[['q1','q2']].reset_index()
.merge(data_, left_on=['q1'], right_on=['h'])
.merge(data_, left_on=['q2','groupId'],
right_on=['h','groupId'])
.groupby('index')['groupId'].nunique()
)
print (question)
q1 q2 howManyGroups
0 s1 l1 2
1 s1 s2 2
2 s2 l2 3
3 s3 l3 2
4 s3 l1 1
気の数が不明な場合は、次のような方法を試すことができます。
df_tmp = (question.reset_index()
.merge(data_, left_on=['q1'], right_on=['h'])
)
l_q = question.filter(regex='q\d*').columns.tolist()
l_q.remove('q1')
for q in l_q:
df_tmp = df_tmp.merge(data_, left_on=[q,'groupId'], right_on=['h', 'groupId'])
question['howManyGroups'] = df_tmp.groupby('index')['groupId'].nunique()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加