考虑以下Pandas dataframe:
col_a col_b col_c
0 10 15 20
0 10 15 20
1 10 15 20
1 10 15 20
1 10 15 20
1 10 15 20
2 10 15 20
现在,让我们考虑我们想要以下Map:
{
0: 'col_a',
1: 'col_b',
2: 'col_c'
}
Map本质上决定了我们应该为每个索引保留哪一列!
输出df
:
column
0 10
0 10
1 15
1 15
1 15
1 15
2 20
到目前为止,我有这样的东西:
keep_cols = [(0, 'col_a'), (1, 'col_b'), (2, 'col_c')]
output = pd.concat([df.loc[df['index_col'] == idx, col] for idx, col in keep_cols], axis=1)
然而,我在实际连接它们之前创建了子dfs,我想就性能而言,这是次优的!
3条答案
按热度按时间fnx2tebb1#
对
map
使用索引查找:输出:
如果要将Series或新DataFrame作为输出:
输出:
替代
为了好玩,这里有另一个使用
stack
的替代方法,如果每行只有一个匹配:输出:
限制
如果你的索引没有匹配,
factorize
将返回-1
,这将被错误地Map,你应该用途:如果使用另一种解决方案,您将无法使用
reindex
(s[m].droplevel(1).reindex(df.index)
),因为您有重复的索引,这将引发错误。示例:
7vux5j2d2#
使用
Index.map
通过索引/列标签查找值:或者使用
rename
:对于传递给
DataFrame
构造函数的一列DataFrame:kse8i1jr3#
另一种可能的解决方案:
输出: