我有一個 20441 行和 158 列的資料框。在每一行中,都有很多“NA”值。所以我想把它轉換成這樣的:
如果一個值不是 NA,我將它的行名、列名和值保存在另一個資料框中。例如我的第一個資料框是:
| 行和列名 | c1 | c2 | c3 | c4 | c5 |
|---|---|---|---|---|---|
| r1 | 不適用 | 不適用 | 不適用 | 5 | 6 |
| r2 | 1 | 3 | 不適用 | 不適用 | 不適用 |
| 行名 | c1 | c2 |
|---|---|---|
| r1 | c4 | 5 |
| r1 | c5 | 6 |
| r2 | c1 | 1 |
| r2 | c2 | 3 |
uj5u.com熱心網友回復:
使用melt:
out = (df.melt('row and column name', var_name='C1', value_name='C2')
.dropna().astype({'C2': int}))
輸出:
| 行和列名 | C1 | C2 |
|---|---|---|
| r2 | c1 | 1 |
| r2 | c2 | 3 |
| r1 | c4 | 5 |
| r1 | c5 | 6 |
uj5u.com熱心網友回復:
使用 df.melt 的答案有效,但比下面的代碼慢。我使用 %%timeit 來測量每個代碼的時間。
df.melt 需要 2.47 ms ± 93.5,以下代碼需要 314 μs ± 10.4
如果性能不重要,那么 df.melt 更好,因為它是一行代碼。
row = []
cols = []
val = []
for col in data.columns[1:]:
for i,e in enumerate(data[col]):
if pd.isna(e) == False:
row.append(data['row&col name'][i])
cols.append(col)
val.append(e)
new_data = pd.DataFrame(list(zip(row,cols,val)),columns=['row','col','val'])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/486598.html
