我有一个数据框:
df1 = pd.DataFrame({'sku': ['A0', 'A0', 'A2', 'A2', 'A2','A3', 'A3'],
'ID': ['10', 'T1', 'T1', 'T2', 'T2','10', '20']})
我想计算ID的唯一值,但仅当以“ T”开头时。理想的结果是:
sku
A0 1
A2 2
A3 0
请告知。
答案 0 :(得分:3)
按sku
分组,然后将str.startswith
函数应用于每个组的唯一ID
系列,以对那些以“ T”开头的唯一ID进行计数:
>>> df1.groupby('sku').apply(lambda g: pd.Series(g['ID'].unique()).str.startswith("T").sum())
sku
A0 1
A2 2
A3 0
答案 1 :(得分:3)
向量化后,您可以在过滤数据框后使用pd.Series.value_counts
。
您可以使用分类数据来确保包括所有键:
df1 = pd.DataFrame({'sku': ['A0', 'A0', 'A2', 'A2', 'A3', 'A3'],
'ID': ['10', 'T1', 'T1', 'T2', '10', '20']})
df1['sku'] = df1['sku'].astype('category')
res = df1.loc[df1['ID'].str[0] == 'T', 'sku'].value_counts(sort=False)
print(res)
A0 1
A2 2
A3 0
Name: sku, dtype: int64
对于唯一值,可以使用groupby
+ nunique
:
res = df1[df1['ID'].str[0] == 'T'].groupby('sku')['ID'].nunique()