用某些字符串[pandas]替换/移动值

时间:2019-10-02 11:29:28

标签: python pandas csv dataframe data-cleaning

例如,我有一个肮脏的数据集,如果在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')

1 个答案:

答案 0 :(得分:3)

sortedre.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:逐行迭代PhoneEmail列:

[('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'], []]]

现在sortedkey=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']]

有所需的输出!