Python 大数据帧中一小部分值的频率

Python 大数据帧中一小部分值的频率,python,pandas,dataframe,dummy-variable,Python,Pandas,Dataframe,Dummy Variable,这提供了一个示例,说明如何使用pd.get_dummies+聚合从pandas数据帧获取给定行的频率计数。但是,如果您只需要非常大的数据帧中的一小部分术语,那么这种方法是不可伸缩的 例如,考虑同一个例子: 将熊猫作为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'], “类别2”:[“否8”、“是15”、“是16

这提供了一个示例,说明如何使用pd.get_dummies+聚合从pandas数据帧获取给定行的频率计数。但是,如果您只需要非常大的数据帧中的一小部分术语,那么这种方法是不可伸缩的

例如,考虑同一个例子:

将熊猫作为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'],
“类别2”:[“否8”、“是15”、“是16”、“否18”、“否21”],
“第三类”:[pd.NA,“否”51、“是”1、“否3”、“否4'],
'class100':['yes_3','no_5',pd.NA','yes_6','no_7']]
ID类别1类别2类别3类别100
0 xyz\u 1是\u 1否\u 8是\u 3
1 xyz_2否2是15否51否5
2 xyz_3是16是1
3 xyz_4否3否18否3是6
4 xyz_400 no_7 no_21 no_4 no_7
它们可以是许多不同的分类变量之一,而不是“是”和“否”集合中的值。如果你只是想知道是1,不是51的频率项,这需要大量的额外计算

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

set=['yes\u 1','no\u 51']
df[~df.isin(set)]=pd.NA
ID类别1类别2类别3类别100
0是\u 1
1号(51)
2是的1
3.
4.

对于大约一百万个条目的大型数据帧来说,速度仍然非常缓慢。有没有更好的扩展方法。

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

(
    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()
)

在相关问题中,更有效的解决方案是:

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

你试过了吗?看看这是否能给你带来任何改善。根据我的经验,pandas和numpy函数的伸缩性很好。如果您仍然需要更高的性能,并且数据帧可以暂时分解,那么您可以考虑感谢您的贡献,但理想情况下,我希望对任何可接受的值集进行黑盒处理。
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