根据 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
我想从中得到:
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