从另一个数据框中计算 nunique

Posted

技术标签:

【中文标题】从另一个数据框中计算 nunique【英文标题】:count nunique from another dataframe 【发布时间】:2021-04-18 13:44:11 【问题描述】:

我的目标是添加一个列,该列使用 dfA 中的键计算 dfB 中主键的唯一实例数。 dfA 的主键只出现一次,而 dfB 的主键出现多次。

示例。

dfA

Agreement Date_1
146108493 1/31/2019
142527722 1/9/2019

dfB

Agreement Date_2
146108493 2/4/2019
146108493 2/15/2019
146108493 2/20/2019
142527722 2/28/2019
142527722 3/15/2019

目标结果调整后的 dfA

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

【问题讨论】:

【参考方案1】:

您可以在Agreement 上使用group 数据框dfB 并使用count 然后将map 的值聚合到dfA 基于主键Agreement

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

或者按照 @Pygirl 在 cmets 中的建议,将 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

【讨论】:

Nice catch @pygirl 这当然是一个更简洁的选择.. dfa['count'] = dfa['Agreement'].map(dfb['Agreement'].value_counts()) 如果只考虑协议中的实例数【参考方案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

【讨论】:

【参考方案3】:

尝试:

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 天内,有多少 dfA 协议出现在 dfB 中 .fillna(0)替换NaN

以上是关于从另一个数据框中计算 nunique的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用nunique函数计算dataframe每一个数据行的独特值的个数(count number of unique values in each row of dataframe)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组len函数和nunique函数计算分组的个数(分组包含多个dataframe)

pandas使用goupby函数和nunique函数计算每个分组对应的多个变量的独特值的个数( unique values of each group in dataframe)

从另一台计算机或手机添加数据后,如何更新计算机上的视图?

如何从另一个数据框中扩展数据框中的值[重复]

如何使用熊猫从另一个数据框中的一个数据框中查找值?