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

标签 python pandas dataframe dummy-variable

question提供了一个示例,说明如何使用 pd.get_dummies + 聚合从 pandas 数据帧中获取给定行的频率计数。但是,如果您只想从非常大的数据框中提取一小部分术语,这就无法扩展。

例如考虑同一个例子:

import pandas as pd

df = 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 class100
0    xyz_1  yes_1    no_8   <NA>    yes_3
1    xyz_2   no_2  yes_15  no_51     no_5
2    xyz_3   <NA>  yes_16  yes_1     <NA>
3    xyz_4   no_3   no_18   no_3    yes_6
4  xyz_400   no_7   no_21   no_4     no_7

值不是在是和否的集合中,而是可以是许多不同的分类变量之一。如果您只想要 yes_1、no_51 的频率项,这需要大量额外计算。

到目前为止我找到的最好的解决方案是将其他值预处理为 NAN

set = ['yes_1', 'no_51']
df[~df.isin(set)] = pd.NA

     ID class1 class2 class3 class100
0  <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 万个条目的大型数据帧,这仍然非常缓慢。有没有办法更好地扩展它。

最佳答案

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

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']}) 

关于python - Large Pandas Dataframe 中一小部分值的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64288335/

相关文章:

r - 显示并删除 top_n 最长的 n 个持续时间

r - 合并数据框中的行,其中行不相交并包含 NA

python - 使用 Python 引发异常时回滚操作的最佳方法

python - 在 Python 中将 yyyy-mm-dd 转换为 yyyy-ww

python - 基于唯一行的 Concat python 数据帧

Python 搜索文本列,如果单词列表中有任何匹配的关键字,则返回

python - 两个数据帧的 Pandas 合并的输出不会产生预期的形状

python - 如果单独的值与 Pandas 中的列表匹配,则更新单元格值

python - 有效地对元组列表进行分组

python - 模板参数是否可以等于另一个元素的值?