为了账号安全,请及时绑定邮箱和手机立即绑定

Large Pandas Dataframe 中一小部分值的频率

Large Pandas Dataframe 中一小部分值的频率

慕尼黑的夜晚无繁华 2023-10-26 15:42:34
这个问题提供了一个示例,说明如何使用 pd.get_dummies + 聚合从 pandas 数据帧获取给定行的频率计数。但是,如果您只需要一个非常大的数据帧中的一小部分术语,则这无法扩展。例如考虑相同的例子:import pandas as pddf = pd.DataFrame({'ID': ['xyz_1', 'xyz_2', 'xyz_3', 'xyz_4', 'xyz_400'],                   'class1': ['yes_1', 'no_2', pd.NA, 'no_3', 'no_7'],                   'class2': ['no_8', 'yes_15', 'yes_16', 'no_18', 'no_21'],                   'class3': [pd.NA, 'no_51', 'yes_1', 'no_3', 'no_4'],                   'class100': ['yes_3', 'no_5', pd.NA, 'yes_6', 'no_7']})        ID class1  class2 class3 class1000    xyz_1  yes_1    no_8   <NA>    yes_31    xyz_2   no_2  yes_15  no_51     no_52    xyz_3   <NA>  yes_16  yes_1     <NA>3    xyz_4   no_3   no_18   no_3    yes_64  xyz_400   no_7   no_21   no_4     no_7它们可以是许多不同的 calcategori 变量之一,而不是位于 yes 和 no 集合中的值。如果您只想 yes_1、no_51 的频率项,这将需要大量的额外计算。到目前为止我发现的最好的解决方案是将其他值预处理为 NANset = ['yes_1', 'no_51']df[~df.isin(set)] = pd.NA     ID class1 class2 class3 class1000  <NA>  yes_1   <NA>   <NA>     <NA>1  <NA>   <NA>   <NA>  no_51     <NA>2  <NA>   <NA>   <NA>  yes_1     <NA>3  <NA>   <NA>   <NA>   <NA>     <NA>4  <NA>   <NA>   <NA>   <NA>     <NA>对于 100 万个条目的大型数据帧来说,这仍然非常缓慢。有没有办法更好地扩展它。
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

在链接的问题中,性能更高的解决方案是:

df.apply(lambda row: row.value_counts(dropna=False), axis=1).fillna(0)

这可能已经足以满足您的目的;但是,如果您只需要几个值,则可能会更快:

counts = pd.Series({(df == key).values.sum() for key in ['yes_1', 'no_51']})


查看完整回答
反对 回复 2023-10-26
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我不知道它是否比你的技术更好,但我建议将其作为测试的解决方案:


(

    pd

    .melt(df,id_vars=['ID'])

    .assign(yes_1 = lambda x: np.where(x['value']=='yes_1',1,0))

    .assign(no_51 = lambda x: np.where(x['value']=='no_51',1,0))

    .sum()

)


查看完整回答
反对 回复 2023-10-26
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

df.set_index('ID', inplace=True)#Set ID as index

df[~df.isin(['yes_1', 'no_51'])] = np.nan#Set anything not in the set as nan

pd.get_dummies(df.stack().unstack())#get dummies from a datframe that has dropped anycolumns with NaNS


      


              class1_yes_1  class3_no_51  class3_yes_1

ID                                             

xyz_1             1             0             0

xyz_2             0             1             0

xyz_3             0             0             1


查看完整回答
反对 回复 2023-10-26
  • 3 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信