我有以下兩個資料幀:
import pandas as pd
df = pd.DataFrame([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
index = [0, 0.25, 0.50, 0.75, 1],
columns = [0, 0.25, 0.50, 0.75, 1])
df_cross = pd.DataFrame([[0.0, 0.25],
[0.0, 0.75],
[0.5, 1]],
columns = ['indexes_to_keep',
'cols_to_keep'])
df:
0.00 0.25 0.50 0.75 1.00
0.00 0 0 0 0 0
0.25 0 0 0 0 0
0.50 0 0 0 0 0
0.75 0 0 0 0 0
1.00 0 0 0 0 0
df_cross:
indexes_to_keep cols_to_keep
0 0.0 0.25
1 0.0 0.75
2 0.5 1.00
在df我有我的存盤資料,df_cross 包含我想要保留值的索引和列。df索引和列與df_cross我想用字串替換的任何行不匹配的值(例如“NaN”)。
預期的輸出是:
0.00 0.25 0.50 0.75 1.00
0.00 NaN 0 NaN 0 NaN
0.25 NaN NaN NaN NaN NaN
0.50 NaN NaN NaN NaN 0
0.75 NaN NaN NaN NaN NaN
1.00 NaN NaN NaN NaN NaN
提前致謝。
uj5u.com熱心網友回復:
Pandas 不支持使用坐標陣列設定元素。您需要使用 numpy:
# integer locs
rows = df.index.get_indexer(df_cross.indexes_to_keep)
cols = df.columns.get_indexer(df_cross.cols_to_keep)
# where we want to keep the data
mask = np.full(df.shape, False)
mask[rows, cols] = True
df[:] = df.where(mask)
另一種方法,只用 Pandas,創建mask是:
mask = (df_cross.assign(val=True)
.set_index(['indexes_to_keep', 'cols_to_keep'])
['val'].unstack(fill_value=False)
)
輸出:
0.00 0.25 0.50 0.75 1.00
0.00 NaN 0.0 NaN 0.0 NaN
0.25 NaN NaN NaN NaN NaN
0.50 NaN NaN NaN NaN 0.0
0.75 NaN NaN NaN NaN NaN
1.00 NaN NaN NaN NaN NaN
uj5u.com熱心網友回復:
讓我們試著crosstab上df_cross,然后用where掩蓋的值
s = pd.crosstab(*df_cross.values.T)
df.where(s == 1)
0.00 0.25 0.50 0.75 1.00
0.00 NaN 0.0 NaN 0.0 NaN
0.25 NaN NaN NaN NaN NaN
0.50 NaN NaN NaN NaN 0.0
0.75 NaN NaN NaN NaN NaN
1.00 NaN NaN NaN NaN NaN
PS:pd.crosstab(*df_cross.values.T)只是一個語法快捷方式,實際上相當于使用pd.crosstab(df.indexes_to_keep, df.cols_to_keep)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346099.html
