![](/img/trans.png)
[英]What is the fastest way to populate one pandas dataframe based on values from another pandas dataframe?
[英]Populate one dataframe based on group values from another
我有一份 Dataframe數據
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
我有一個 Dataframe問題
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
編輯:我的問題 dataframe 有時可能比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
然后使用 question 和merge
兩次,第一次僅在 q1(和 data_ 中的 h)上獲取與 q1 關聯的 groupId,第二次在 q2 和 groupId 上確保 q1 和 q2 在同一組中。 最后,將您在合並之前使用groupby
保留的原始索引分組,並在 groupId 上使用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
如果您的 qi 數量未知,您可以嘗試以下操作:
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.