【pandas小记】pandas中 map、apply、applymap和transform详解

(一)pandas.Series.map
Series.map(self, arg, na_action=None)
"""
根据输入对应关系映射序列值,用于用另一个值替换序列中的每个值。
map()是Series对象的一个函数,DataFrame中没有map(),map()的功能是将一个自定义函数作用于Series对象的每个元素

注意:Series对象、映射、替换、每个值
"""

#参数
"""
arg:映射对应关系,function, collections.abc.Mapping subclass or Series
na_action:是否忽略NAN?{None, ‘ignore’}, 默认None,若改为‘ignore’,则序列中的NAN不进行映射。
"""

# demo
data = {'ani“”mal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
        'priority': ['yes', np.nan, 'no', 'yes', np.nan, 'no', 'no', 'yes', 'no', 'no']}

labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

df = pd.DataFrame(data=data, index=labels)
df['priority'] = df['priority'].map({'no':False,'yes':True})   # 通过字典映射
df['age'] = df['age'].map(lambda x : "%.3f"%x)  # 通过函数进行映射
"""
  animal    age  visits priority
a    cat  2.500       1     True
b    cat  3.000       3      NaN
c  snake  0.500       2    False
"""

df['animal'] = df['animal'].replace('cat','dog')  # 不对所有值进行替换,替换特定值,与map不同!!!
"""
  animal    age  visits priority
a    dog  2.500       1     True
b    dog  3.000       3      NaN
c  snake  0.500       2    False
"""
(二)pandas.DataFrame.apply
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
"""
将一个自定义函数作用于DataFrame的行或者列,也可以作用于Series。

注意:自定义函数、DataFrame行或列、Series
"""

# 参数
"""
func:自定义函数
axis:函数应用的轴向,默认axis=0
raw:确定行或列作为Series,还是ndarray对象传递?默认为False,作为Series对象传递给函数,如果自定义函数是numpy相关,raw=True,将作为ndarray对象
result_type:默认为None,只有针对于axis=1的情况,如果函数返回一个列表,则结果为列表,如果返回一个Series,则结果为Series
args:tuple,参数元组传递给函数
**kwds:关键字参数传递给函数
"""

# demo
# 计算两个日期之间的天数
def get_Interval(row):
    return row['ReceivedDate'] - row['PublishedDate']


def DateInterval(row, before, after):
    return row[before] - row[after]

def get_yearmonth(data):
    return data.strftime('%Y-%m')


published_date = pd.date_range(start='2020-03-01', end='2020-03-31', freq='B')
received_date = pd.date_range(start='2020-04-01', end='2020-04-30', freq='B')
df = pd.DataFrame({'PublishedDate': published_date, 'ReceivedDate': received_date})
# 使用lambda  
df['DateInterval'] = df.apply(lambda x : x['ReceivedDate'] - x['PublishedDate'],axis=1)
# 调用函数
# df['DateInterval'] = df.apply(get_Interval,axis=1)

# args传入参数 apply会往DateInterval中传入一个参数,所以DateInterval接收三个参数
# df['DateInterval'] = df.apply(DateInterval, axis=1, args=('ReceivedDate', 'PublishedDate'))

# **kwds传入参数
# df['DateInterval'] = df.apply(DateInterval, axis=1, before = 'ReceivedDate', after='PublishedDate')

# Series也可以调用,但是没法使用参数axis
# df['ReceivedDate_ym'] = df['ReceivedDate'].apply(lambda x : x.strftime('%Y-%m'))
# df['ReceivedDate_ym'] = df['ReceivedDate'].apply(lambda x : x.strftime('%Y-%m'),axis=1)  报错
# df['ReceivedDate_ym'] = df['ReceivedDate'].apply(get_yearmonth)
# df['ReceivedDate_ym'] = df['ReceivedDate'].apply(get_yearmonth,axis=1) 报错
print(df)
(三)pandas.DataFrame.applymap
DataFrame.applymap(self, func)
"""
函数可以对DataFrame里的每个值进行处理,然后返回一个新的DataFrame
注意:作用于每个元素,并返回对应的结果
"""

# 参数
"""
func:函数
"""

#demo
def add_one(x):
    return x + 1

df = pd.DataFrame({
    'a': [1, 2, 3],
    'b': [10, 20, 30],
    'c': [5, 10, 15]
})
# 调用函数
print(df.applymap(add_one))
print(df+1)

# lambda
print(df.applymap(lambda x :x**2))
print(df**2)
(四)pandas.DataFrame.transform
DataFrame.transform(self, func, axis=0, *args, **kwargs)
"""
在dataframe上调用函数,生成的dataframe与原dataframe有相同的轴长度
key:沿轴长度相同
"""

# 参数
"""
func:用于转换的函数,可以接受以下的情况:
1,自定义函数
2,函数名
3,函数名列表
4,轴标签与函数名的字典
axis:函数应用的轴向,默认axis=0
"""

# demo
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1]}

labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data=data, index=labels)


print(df.groupby(['animal']).apply(lambda x:x.mean()))
"""
apply返回聚合后的结果
        age  visits
animal             
cat     2.5     2.0
dog     5.0     2.0
snake   2.5     1.5
"""
print(df.groupby(['animal']).transform(lambda x:x.mean()))
"""
transform 返回的shape是(len(df),1)。注:如果与groupby()方法联合使用,需要对值进行去重
   age  visits
a  2.5     2.0
b  2.5     2.0
c  2.5     1.5
d  5.0     2.0
e  5.0     2.0
f  2.5     2.0
g  2.5     1.5
h  2.5     2.0
i  5.0     2.0
j  5.0     2.0
"""
print(df.groupby(['animal']).apply(lambda x:x['age'] - x['visits']))
# transform 只允许在同一时间在一个Series上进行一次转换,如果定义列‘a’ 减去列‘b’,  则会出现异常;
print(df.groupby(['animal']).transform(lambda x:x['age'] - x['visits']))

# 函数名列表
print(df['visits'].transform([np.sqrt,np.exp]))

# 轴标签:函数名字典
print(df[['age','visits']].transform({'age':np.sqrt,'visits':np.exp}))
(五)总结

1,map,apply,applymap

  1. map()是pandas.series.map()方法,对每个值进行映射操作。
  2. apply()是DF的方法, 对DF中的数据按行/列应用func操作,也可以单独对Series应用func操作。
  3. applymap()也是DF的方法, 对整个DF所有元素应用func操作。

2,apply()与 transform()

  1. transform只允许在同一时间在一个Series上进行一次转换,如果定义列‘a’ 减去列‘b’,则会出现异常;
    transform返回的shape是(len(df),1)。注:如果与groupby()方法联合使用,需要对值进行去重;

  2. 不同于transform只允许在Series上进行一次转换,apply对整个DataFrame 作用;
    apply不能直接通过函数名直接调用,而transform可以用函数名调用,也可以对不同标签进行不同计算;

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
pandasapplymapapplymap都是用于对DataFrame或Series的数据进行函数应用的方法,它们的具体使用方式和作用略有不同。 1. apply方法 apply方法是用于对DataFrame或Series的行或列执行函数操作的方法。可以通过传递axis参数来指定是对行还是列进行操作,默认是对列进行操作。apply方法接受一个函数作为参数,并将该函数应用到DataFrame或Series的每一个元素上,然后将结果组合成一个新的DataFrame或Series。 示例: ``` import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data) def add_one(x): return x + 1 # 对每一列执行add_one函数 df.apply(add_one) # 对每一行执行add_one函数 df.apply(add_one, axis=1) ``` 2. map方法 map方法是用于对Series的每一个元素执行函数操作的方法。它接受一个函数作为参数,并将该函数应用到Series的每一个元素上,然后将结果组合成一个新的Series。 示例: ``` import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data) def add_one(x): return x + 1 # 对Series A 的每一个元素执行add_one函数 df['A'].map(add_one) ``` 3. applymap方法 applymap方法是用于对DataFrame的每一个元素执行函数操作的方法。它接受一个函数作为参数,并将该函数应用到DataFrame的每一个元素上,然后将结果组合成一个新的DataFrame。 示例: ``` import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data) def add_one(x): return x + 1 # 对DataFrame的每一个元素执行add_one函数 df.applymap(add_one) ``` 总结: apply方法适用于对DataFrame或Series的行或列执行函数操作;map方法适用于对Series的每一个元素执行函数操作;applymap方法适用于对DataFrame的每一个元素执行函数操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值