从另一个数据框计算唯一值数量

3
我的目标是在dfA中添加一列,该列使用dfB中的键来计算主键的唯一实例数。 dfA仅显示主键出现一次,而dfB可能多次出现主键。
示例。
dfA
协议 Date_1
146108493 1/31/2019
142527722 1/9/2019
dfB
协议 Date_2
146108493 2/4/2019
146108493 2/15/2019
146108493 2/20/2019
142527722 2/28/2019
142527722 3/15/2019
目标结果- 调整后的dfA
协议 Date_1 Count
146108493 1/31/2019 3
142527722 1/9/2019 2
3个回答

3

您可以按照Agreement分组dfB数据框并使用count进行聚合,然后基于主键Agreement将这些值mapdfA中:

dfA['Count'] = dfA['Agreement'].map(dfB.groupby('Agreement')['Date_2'].count())

或者根据@Pygirl在评论中的建议,使用value_countsmap

dfA['Count'] = dfA['Agreement'].map(dfB['Agreement'].value_counts())

   Agreement     Date_1  Count
0  146108493  1/31/2019      3
1  142527722   1/9/2019      2

很好的发现 @pygirl,这肯定是更简洁的选择。 - Shubham Sharma
dfa['count'] = dfa['Agreement'].map(dfb['Agreement'].value_counts()) 如果只考虑协议的实例计数 - Pygirl

2
使用 df.merge
In [1161]: x = dfA.merge(dfB, indicator='Count').query('Count == "both"').groupby('Agreement').size().reset_index(name='Count')

In [1165]: dfA = dfA.merge(x)

In [1166]: dfA
Out[1166]: 
   Agreement     Date_1  Count
0  146108493  1/31/2019      3
1  142527722   1/9/2019      2

2

尝试:

x = dfa.merge(dfb, on='Agreement', how='right')
y = x.groupby('Agreement').size().reset_index(name='Count')
dfa = dfa.merge(y, on='Agreement')

简单来说:

dfa.join(dfb['Agreement'].groupby(dfb['Agreement']).count().rename('Count'), on='Agreement')

dfa:

    Agreement   Date_1  count
0   146108493   1/31/2019   3
1   142527722   1/9/2019    2

编辑:

尝试使用此函数进行过滤。

def grpdates(grp):
    stRow = grp.iloc[0]
    stRow1 = dfa[dfa['Agreement']==stRow.Agreement].Date_1
    grp = grp[np.array(grp.Date_2)<=np.array(stRow1 + pd.DateOffset(days=30))]
    return grp  

dfb['Date_2'] = pd.to_datetime(dfb.Date_2, format='%m/%d/%Y')
dfa['Date_1'] = pd.to_datetime(dfa.Date_1, format='%m/%d/%Y')

df = dfb.groupby('Agreement', group_keys=False).apply(grpdates)
dfa['Count'] = dfa['Agreement'].map(df['Agreement'].value_counts())

dfa:

    Agreement   Date_1      Count
0   146108493   2019-01-31  3.0
1   142527722   2019-01-09  NaN

感谢您在这里提供帮助。您如何向数据框中添加一个基于日期列的附加过滤器来计算协议数量?例如,计算在dfA Date_1之后30天内,在dfB中有多少个dfA协议出现。 - Ethan
使用.fillna(0)替换NaN。 - Pygirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接