例如,我有一个肮脏的数据集,如果在phone
列中填写了电子邮件,则需要将电子邮件移至email
列并将phone
列留空,如果电子邮件和电话在A03等错误的位置填写,我需要将它们交换到右列。
ID Phone Email
A01 111111 abc@mail.com
A02 bcd@mail.com NaN
A03 def@mail.com 222222222
当前,我可以删除带有电子邮件地址的phone
列中的所有单元格,但是我不知道如何比较两列并交换它们。
eduDup['phone'] = eduDup.phone.str.replace(r'(^.*@.*$)', 'aaaaaaaaaaaaaaaa sport')
答案 0 :(得分:3)
将sorted
与re.findall
一起使用:
df = df.fillna('')
df[['Phone', 'Email']] = [sorted(t, key=lambda x:re.findall(r'(^.*@.*$)', x))
for t in df[['Phone', 'Email']].values]
输出:
ID Phone Email
0 A01 111111 abc@mail.com
1 A02 bcd@mail.com
2 A03 222222222 def@mail.com
洞察力:
for t in df[['Phone', 'Email']].values
:逐行迭代Phone
和Email
列:
[('111111', 'abc@mail.com'),
('bcd@mail.com', ''),
('def@mail.com', '222222222')]
现在, sorted(t, key=lambda x:re.findall(r'(^.*@.*$)', x))
为每个元组t
排序,检查元组的元素是否为电子邮件。看看没有sorted
会发生什么,只需应用lambda
:
f = lambda x:re.findall(r'(^.*@.*$)', x)
[[f(i) for i in t] for t in df[['Phone', 'Email']].values]
# Output
[[[], ['abc@mail.com']],
[['bcd@mail.com'], []],
[['def@mail.com'], []]]
现在sorted
和key=f
将通过使用f
检查元素来排序。应用密钥后,空列表将排在最前面(因为空列表[]
的值为False
,而[...]
为True
:请检查[] < [1]
)。< / p>
[sorted(t, key=f) for t in df[['Phone', 'Email']].values]
结果:
[['111111', 'abc@mail.com'],
['', 'bcd@mail.com'],
['222222222', 'def@mail.com']]
有所需的输出!