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

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

Pandas - 根據條件計算相關事件

Pandas - 根據條件計算相關事件

Helenr 2022-07-05 17:01:07
我想創建 DataFrame,可能是稀疏的,它測量用戶之間的相關性。在這里,我對 和 之間相關性的定義user_1是user_2它們action在同一天執行相同的次數。我將嘗試用一個例子更好地解釋自己。假設我有以下數據框:date    action  user6   2019-05-05  b   user_39   2019-05-05  b   user_21   2019-05-06  b   user_25   2019-05-06  a   user_10   2019-05-07  b   user_37   2019-05-07  a   user_28   2019-05-07  a   user_12   2019-05-08  c   user_24   2019-05-08  c   user_13   2019-05-09  c   user_3可以使用以下代碼段生成:import numpy as npimport pandas as pdnp.random.seed(12)users = np.random.choice(['user_1', 'user_2', 'user_3'], size=10)actions = np.random.choice(['a', 'b', 'c'], size=10)date = np.random.choice(pd.date_range(start='2019-05-05', end='2019-05-10', freq='D'), size=10)df = pd.DataFrame(dict(date=date, action=actions, user=users))df.date = pd.to_datetime(df.date)df = df.sort_values('date')user_1和之間的相關性user_2是2因為它們都執行a了當天的07操作和c當天的操作08。user_2和之間的相關性user_3是1因為他們b在 day執行了操作05。其余的都是NaN. 他們輸出我正在尋找的DataFrame如下:        user_1  user_2  user_3user_1  NaN     NaN     NaNuser_2  2.0     NaN     NaNuser_3  NaN     1.0     NaN我創建此 DataFrame 的低效方法如下:from itertools import combinationsdf_result = pd.DataFrame(columns=['user_1', 'user_2', 'user_3'],                         index=['user_1', 'user_2', 'user_3'], dtype=np.float64)    for index, group in df.groupby(['date', 'action']):    for x, y in combinations(list(group.user.values), 2):        if np.isnan(df_result.loc[x,y]):            df_result.loc[x, y] = 1        else:            df_result.loc[x, y] = df_result.loc[x, y] + 1這種方法的問題是在我的用例中變慢了。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

這是一種潛在的方法,使用, 在和merge上自我加入。然后使用, 過濾掉兩邊用戶相等的地方,最后用于輸出。dateactionquerypivot_table


df_corr = (df.merge(df, on=['date', 'action'])

           .query('user_x != user_y')

           .pivot_table(index='user_x', columns='user_y', aggfunc='size'))

[出去]


user_y  user_1  user_2  user_3

user_x                        

user_1     NaN     2.0     NaN

user_2     2.0     NaN     1.0

user_3     NaN     1.0     NaN

如果僅需要顯示相關矩陣的下三角形,則可以NaN使用以下方法輸出上半部分:


mask = np.triu_indices_from(df_corr)

df_corr.values[mask] = np.nan

[出去]


user_y  user_1  user_2  user_3

user_x                        

user_1     NaN     NaN     NaN

user_2     2.0     NaN     NaN

user_3     NaN     1.0     NaN


查看完整回答
反對 回復 2022-07-05
  • 1 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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