从另一个数据框中计算 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_counts
与 map
一起使用:
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)