我有下面的 Dataframe 。
A B
0 1.0 4
1 2.0 5
2 NaN 6
字符串
我想把它变成下面的框架。
A B val val_source
0 1.0 4 1.0 A
1 2.0 5 2.0 A
2 NaN 6 6.0 B
型
最简单的方法是什么?我设想一个np.select
,它返回多个列,类似于
conds = [df['A'].notna(), True]
choices = [df[['A']].assign(val_source='A'), df[['B']].assign(val_source='B')]
df[['val', 'val_source']] = np.select(conds, choices)
型
但这会导致一个错误。我被迫执行两个单独的np.select
语句,尽管它们共享相同的conds
。
conds = [df['A'].notna(), True]
_choices_val_src = [
(df['A'], 'A'),
(df['B'], 'B'),
]
choices_val, choices_src = zip(*_choices_val_src)
df['val'] = np.select(conds, choices_val, default=np.nan)
df['val_source'] = np.select(conds, choices_src, default=np.nan)
型
有没有更干净的方法来做这件事?
2条答案
按热度按时间yuvru6vn1#
使用子集/索引,如下所示:
字符串
rkue9o1l2#
对于这组特定的条件,您还可以更改方法:
stack
和groupby.first
。字符串
输出量:
型
或者因为你只有两个条件可供选择:
型
输出量:
型