亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號