鱼C论坛

 找回密码
 立即注册
查看: 2512|回复: 5

[已解决]pandas.DataFrame.apply的疑问

[复制链接]
发表于 2021-6-9 13:53:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于apply的用法,假设有一个DataFrame
>>> df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
>>> df
   A  B
0  4  9
1  4  9
2  4  9

如果对df引入lambda x :x+1函数,结果比较好理解
>>> df.apply(lambda x :x+1)
   A   B
0  5  10
1  5  10
2  5  10

如果引入lambda x: [1, 2],就看不懂了,
>>> df.apply(lambda x: [1, 2],axis=0)
   A  B
0  1  1
1  2  2
>>> df.apply(lambda x: [1, 2], axis=1)
0    [1, 2]
1    [1, 2]
2    [1, 2]
dtype: object


例子来源于https://pandas.pydata.org/pandas ... das.DataFrame.apply

问题1:lambda x: [1, 2],冒号右边没有x,意思是每一个x的返回值都是 [1, 2]吗?
问题2:df.apply(lambda x: [1, 2],axis=0)的结果为啥少了一行,而df.apply(lambda x: [1, 2], axis=1)少了一列,而且返回的内容也不同?
烦请高手指点,谢谢!
最佳答案
2021-6-9 15:41:32
本帖最后由 rsj0315 于 2021-6-9 15:42 编辑

收线dataframe,axis=0作用的是列,1是行

官方文档原话“0 or ‘index’: apply function to each column.

1 or ‘columns’: apply function to each row.”
df=df.apply(lambda x: [1, 2], axis=0)
print(df.values,df.dtypes)
看下dtypes就不难理解了。
相当于每列数据换成了一个列表【1,2】;
=====
[list([1, 2]) list([1, 2])] object

----------------------
同理axis=1是把每一行数据换成了

=====
[list([1, 2]) list([1, 2]) list([1, 2])] object


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-9 15:41:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 rsj0315 于 2021-6-9 15:42 编辑

收线dataframe,axis=0作用的是列,1是行

官方文档原话“0 or ‘index’: apply function to each column.

1 or ‘columns’: apply function to each row.”
df=df.apply(lambda x: [1, 2], axis=0)
print(df.values,df.dtypes)
看下dtypes就不难理解了。
相当于每列数据换成了一个列表【1,2】;
=====
[list([1, 2]) list([1, 2])] object

----------------------
同理axis=1是把每一行数据换成了

=====
[list([1, 2]) list([1, 2]) list([1, 2])] object


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-9 15:48:33 | 显示全部楼层
df3=df.applymap(lambda x: [1, 2])
print(df3.values,df3.dtypes)
看下这个结果
[[list([1, 2]) list([1, 2])]
[list([1, 2]) list([1, 2])]
[list([1, 2]) list([1, 2])]] A    object
B    object
dtype: object
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-10 09:26:18 | 显示全部楼层
rsj0315 发表于 2021-6-9 15:48
看下这个结果
[) list([1, 2])]
) list([1, 2])]

可以理解为.apply()是以整个轴为单位,看成1个x,而.applymap()是以每个元素为单位看成1个x,这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-10 13:14:22 | 显示全部楼层
O2H2O 发表于 2021-6-10 09:26
可以理解为.apply()是以整个轴为单位,看成1个x,而.applymap()是以每个元素为单位看成1个x,这样吗?

我的理解是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-10 16:04:33 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-6-10 16:16 编辑

你再仔细读两遍文档对参数的解释:
func : function 
Function to apply to each column or row.

axis : {0 or ‘index’, 1 or ‘columns’}, default 0
Axis along which the function is applied:

0 or ‘index’: apply function to each column.
1 or ‘columns’: apply function to each row. 

axis = 0, 相当于 构造df时,这样 pd.DataFrame( {'A': [1, 2], 'B': [1, 2]} )  
即 0 or ‘index’: apply function to each column.

axis = 1, 即 相当于 pd.DataFrame( [ [1, 2], [1, 2], [1,2] ] )
即 1 or ‘columns’: apply function to each row.

应该很清楚了吧。

另外,对于df.apply(lambda x: x+1) 时,它比较“智能”,
它“知道”你是想要对每行或每列里的每个值进行+1,这种情况和用法很常见,故更易理解。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表