我有一個資料框,
L-1 L-1-1 L-1-2 L-1-3 L-2 L-2-1 L-2-2 L-2-3
L-1 0 0 0 0 0 0 0 0
L-1-1 0 0 0 0 0 0 0 0
L-1-2 0 0 0 0 0 0 0 0
L-1-3 0 0 0 0 0 0 0 0
L-2 0 0 0 0 0 0 0 0
L-2-1 0 0 0 0 0 0 0 0
L-2-2 0 0 0 0 0 0 0 0
L-2-3 0 0 0 0 0 0 0 0
我想用行和列的包含關系在每個單元格中填充 1
輸出將是
L-1 L-1-1 L-1-2 L-1-3 L-2 L-2-1 L-2-2 L-2-3
L-1 1 1 1 1 0 0 0 0
L-1-1 0 1 0 0 0 0 0 0
L-1-2 0 0 1 0 0 0 0 0
L-1-3 0 0 0 1 0 0 0 0
L-2 0 0 0 0 1 1 1 1
L-2-1 0 0 0 0 0 1 0 0
L-2-2 0 0 0 0 0 0 1 0
L-2-3 0 0 0 0 0 0 0 1
例如,
字串“L-1”包括“L-1”,因此單元格 (1,1) 將為 1。
字串“L1-1-1”包括“L-1”,因此單元格 (1,2) 將為 1。
字串“L-2-1”不包括“L-1”,因此單元格 (1,6) 將為 0。
等等。
uj5u.com熱心網友回復:
將 numpy 廣播用于comapre 原始索引和列,以及在 last 之后洗掉值的列,_然后傳遞給DataFrame.mask:
i1 = df.index.to_numpy()
c1 = df.columns.to_numpy()
c = df.columns.str.rsplit('-', n=1).str[0].to_numpy()
df = df.mask((c == i1[:, None]) | (c1 == i1[:, None]), 1)
print (df)
L-1 L-1-1 L-1-2 L-1-3 L-2 L-2-1 L-2-2 L-2-3
L-1 1 1 1 1 0 0 0 0
L-1-1 0 1 0 0 0 0 0 0
L-1-2 0 0 1 0 0 0 0 0
L-1-3 0 0 0 1 0 0 0 0
L-2 0 0 0 0 1 1 1 1
L-2-1 0 0 0 0 0 1 0 0
L-2-2 0 0 0 0 0 0 1 0
L-2-3 0 0 0 0 0 0 0 1
或Series.str.startswith用于掩碼的每個索引值:
df = df.mask(np.array(list(df.index.map(lambda x: df.columns.str.startswith(x)))), 1)
print (df)
L-1 L-1-1 L-1-2 L-1-3 L-2 L-2-1 L-2-2 L-2-3
L-1 1 1 1 1 0 0 0 0
L-1-1 0 1 0 0 0 0 0 0
L-1-2 0 0 1 0 0 0 0 0
L-1-3 0 0 0 1 0 0 0 0
L-2 0 0 0 0 1 1 1 1
L-2-1 0 0 0 0 0 1 0 0
L-2-2 0 0 0 0 0 0 1 0
L-2-3 0 0 0 0 0 0 0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496106.html
