首页 > 解决方案 > 如何将数据框中的所有列传递到不同的用户定义函数

问题描述

如何将数据框中的所有列传递到不同的用户定义函数

这是我的数据框看起来像

    data = [['tom', 10, 9876765143, 'SUN 1023'], ['nick', 15, 98767654312, 'SUN 1023'], ['juli', 14, 98769876541, 'SUN 1023']]    
    df = pd.DataFrame(data, columns = ['Name', 'Age', 'Number', 'Address'])         
    df 

这是现在的功能,我只展示一个功能

        def number(inp):
            import re
            regex = r'^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$'
            inp = inp.replace(regex, 'XXXXXXX')
            print (inp)

  number(df.Number)

它抛出错误

     ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

同样,我有多个函数我只想将数据帧中的每一列与数据帧列中关联的值传递到每个用户定义的函数中,就像我有一个函数号一样,我还有其他函数 def new() def beg() 一个一个. 有没有办法解决这个问题

标签: pythonregexpandas

解决方案


为什么还要使用函数?您可以直接将正则表达式模式应用于相关列。

regex = r'^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$'

>>> df['Number'].astype(str).str.replace(regex, 'XXXXXXX')
0    XXXXXXX
1    XXXXXXX
2    XXXXXXX
Name: Number, dtype: object

如果你需要一个函数:

import random

def phone_number(series):
    regex = r'^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$'
    return series.str.replace(regex, 'X' * random.randrange(3, 8))

>>> phone_number(df['Number'].astype(str))
0    XXXXXXX
1    XXXXXXX
2    XXXXXXX
Name: Number, dtype: object

推荐阅读