Pandas:抓取数据帧中的位置,其中索引列在另一个数据帧中



假设我有2个数据帧,其中填充了索引,以便列中的元素是唯一的,因为在实际数据中它们是:

vals = pd.DataFrame(np.random.randint(0,10,(10, 3)), columns=list('ABC'))
indexes = pd.DataFrame(np.argsort(np.random.randint(0,10,(10, 3)), axis=0)[:5], columns=list('ABC'))
>>> vals
A   B   C
0  64  20  48
1  28  60  81
2   5  73  77
3  74  66  86
4  41  39  21
5  65  37  98
6  10  20  73
7   6  70   3
8  36  29  28
9  43  13  12
>>> indexes
A  B  C
0  4  2  3
1  3  3  8
2  5  1  7
3  9  8  9
4  2  4  0

我只想在vals中保留那些在indexes中列出索引的值。我不关心行完整性或NA,因为稍后我将使用列作为系列。

这就是我想到的:

vals_indexes = pd.DataFrame()
for i in range(vals.shape[1]):
vals_indexes = pd.concat([vals_indexes, vals.iloc[[e for e in indexes.iloc[:, i] if e in vals.index], i]], axis=1)
>>> vals_indexes
A     B     C
0   NaN   NaN  48.0
1   NaN  60.0   NaN
2   5.0  73.0   NaN
3  74.0  66.0  86.0
4  41.0  39.0   NaN
5  65.0   NaN   NaN
7   NaN   NaN   3.0
8   NaN  29.0  28.0
9  43.0   NaN  12.0

这有点难看,但对我有效。问题:有更有效的方法吗?

在循环中使用.loc将不存在的索引替换为nan

for i in vals.columns:
vals.loc[vals[i].isin(list(indexes[i].unique())),i]=np.nan
print(vals)
A    B    C
0  NaN  2.0  NaN
1  NaN  5.0  NaN
2  2.0  3.0  NaN
3  NaN  NaN  NaN
4  NaN  NaN  6.0
5  9.0  NaN  NaN
6  NaN  NaN  4.0
7  NaN  7.0  NaN
8  2.0  NaN  NaN
9  NaN  NaN  NaN

最新更新