3 回答
TA贡献1906条经验 获得超10个赞
您可以将stackandreindex与 zip 一起用于多索引:
df['Z'] = df.stack().reindex(zip(df.index, df.Y.map(d))).reset_index(level=1, drop=True)
输出:
T G D E F K Y Z
0 . . 4 6 8 . A 4
1 . . 1 2 3 . B 2
2 . . 5 7 9 . B 7
3 . . 3 2 1 . NaN NaN
细节:
首先,让我们使用stack,将列标题移动到数据框行索引中,为数据框创建一个多索引。其中,级别 0 是原始行索引,级别 1 是列标题。
现在,我们可以使用它reindex来过滤到我们需要的那些索引。使用元组标识多索引。(level0, level1) 因此,我们zipdf.index 和 df.y.map(d) 一起创建了 reindex 使用的元组。
最后,我们删除多索引的 level=1,创建原始索引的结构,并用这些值分配一个新列。
TA贡献1859条经验 获得超6个赞
我在用 .values
df['Z'] = df.values[df.index, df.columns.get_indexer_for(df.Y.map(d))]
df
Out[135]:
T G D E F K Y Z
0 . . 4 6 8 . A 4
1 . . 1 2 3 . B 2
2 . . 5 7 9 . B 7
3 . . 3 2 1 . NaN NaN
TA贡献1824条经验 获得超8个赞
您可以用列中不存在的一些辅助值替换缺失值,并通过匹配这些值Y添加具有相同名称的新辅助列:DataFrame.assign
df['Z'] = df.assign(tmp = np.nan).lookup(df.index, df.Y.map(d).fillna('tmp'))
print (df)
T G D E F K Y Z
0 . . 4 6 8 . A 4.0
1 . . 1 2 3 . B 2.0
2 . . 5 7 9 . B 7.0
3 . . 3 2 1 . NaN NaN
另一种解决方案:
df[np.nan] = np.nan
df['Z'] = df.lookup(df.index, df.Y.map(d))
df = df.drop(np.nan, axis=1)
print (df)
T G D E F K Y Z
0 . . 4 6 8 . A 4.0
1 . . 1 2 3 . B 2.0
2 . . 5 7 9 . B 7.0
3 . . 3 2 1 . NaN NaN
添加回答
举报