如何使用另一个 DataFrame 的值作为索引和列引用(并替换其他值)来保留 DataFrame 中的值?
How keep a value in a DataFrame using the values of another DataFrame as indexes and columns reference (and replace the others)?
我有以下两个数据框:
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
提前致谢。
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
让我们尝试crosstab
on df_cross
, then use 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)
我有以下两个数据框:
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
提前致谢。
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
让我们尝试crosstab
on df_cross
, then use 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)