根据 c 的值乘以 pandas DataFrame 中的行

Multiply rows in pandas DataFrame depending on values from c

我想从中得到:

nname eemail email2 email3 email4
Stan stan@example.com NO stan1@example.com NO
Danny danny@example.com danny1@example.com danny2@example.com danny3@example.com
Elle elle@example.com NO NO NO

为此:

nname eemail
Stan stan@example.com
Stan stan1@example.com
Danny danny@example.com
Danny danny1@example.com
Danny danny2@example.com
Danny danny3@example.com
Elle elle@example.com

我知道我可以使用名称和电子邮件列创建 4 个单独的 DF,然后合并所有 4 个并删除带有 'NO' 的 DF,但我觉得对此可能有更智能、更动态的解决方案。

result = (
    df.set_index("nname")
    .stack()
    .to_frame("eemail")
    .query("eemail != 'NO'")
    .droplevel(1)
    .reset_index()
)

试试这个:

(df.mask(df.eq('NO'))
 .set_index('nname')
 .stack()
 .droplevel(1)
 .reset_index(level=0,name = 'eemail'))

输出:

   nname              eemail
0   Stan    stan@example.com
1   Stan   stan1@example.com
2  Danny   danny@example.com
3  Danny  danny1@example.com
4  Danny  danny2@example.com
5  Danny  danny3@example.com
6   Elle    elle@example.com