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

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

使用 groupby、pivot 和 transpose 進行 Python pandas

使用 groupby、pivot 和 transpose 進行 Python pandas

滄海一幻覺 2021-08-17 16:14:04
我確實有一個包含兩列的數據框:date和bill_id。日期列中的日期范圍是從 01-01-2017 到 30-12-2017 的一年。有 1000 個獨特的bill_ids. 每個bill_id可能在bill_id列中至少出現一次。結果是一個大小為:2 列,1000000 行的 DataFrame...     dt   |bill_id01-01-2017 bill_101-01-2017 bill_202-01-2017 bill_102-01-2017 bill_303-01-2017 bill_403-01-2017 bill_4因此,某些 name_id 可能會在特定日期出現,而其他則不會。我想要實現的是一種格式的數據框,因此所有唯一的 bill_id 都是列,所有唯一的日期都是行,并且每個 bill_id 具有 0 或 1 或 2 對應的日期值,其中 0 = 尚未出現在該日期,1 出現在那個日期,2 沒有出現在那個日期,但在之前就已經存在了,例如如果 bill_id 存在于 02-01-2017,那么它將在 01-01-2017 為 0,在 02-01-2017 為 1,在 03-01-2017 為 2,在所有后續日期為 2。我用幾個步驟完成了,但代碼沒有擴展,因為它很慢:def map_values(row, df_z, c):    subs = df_z[[c, 'bill_id', 'date']].loc[df_z['date'] == row['dt']]    if c not in subs['bill_id']:        row[c] = max(subs[c].tolist())    else:        val = df_z[c].loc[(df_z['date'] == row['dt']) & (df_z['bill_id'] == c)].values        assert len(val) == 1        row[c] = val[0]    return rowdef map_to_one(x):    bills_x = x['bill_id'].tolist()    for b in bills_x:        try:            x[b].loc[x['bill_id'] == b] = 1        except:            pass    return xdef replace_val(df_groupped, col):    mask = df_groupped.loc[df_groupped['bill_id'] == col].index[df_groupped[col].loc[df_groupped['bill_id'] == col] == 1]    min_dt = df_groupped.iloc[min(mask)]['date']    max_dt = df_groupped.iloc[max(mask)]['date']    df_groupped[col].loc[(df_groupped['date'] < min_dt)] = 0    df_groupped[col].loc[(df_groupped['date'] >= min_dt) & (df_groupped['date'] <= max_dt)] = 1    df_groupped[col].loc[(df_groupped['date'] > max_dt)] = 2    return df_grouppeddef reduce_cols(row):    col_id = row['bill_id']    row['val'] = row[col_id]    return rowdf = df.sort_values(by='date')df = df[pd.notnull(df['bill_id'])]bills = list(set(df['bill_id'].tolist()))編輯:Joe 的回答很好,但我決定改用其他選項:獲取 date.min() 和 date.max()df_groupped = groupby bill_iddf_groupped 應用函數,其中我檢查每組 date_x.min() 和 date_x.max() 并將 date.min() 與 date_x.min() 和 date.max() 與 date_x.max() 進行比較等等我知道 0、1 和 2 在哪里的方式:)
查看完整描述

1 回答

  • 1 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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