【问题标题】:pandas apply updates inplace but returns None熊猫就地应用更新但返回无
【发布时间】:2018-12-20 22:59:09
【问题描述】:

我不明白这种应用行为 .. pandas 应用更新但返回 None

>>>import pandas as pd
>>>df_test = pd.Series({0: {'A', 'E'},
                     1: {'A', 'C', 'E', 'S'},
                     2: {'A', 'C', 'E'},
                     3: {'A', 'C', 'E', 'S'},
                     4: {'A', 'E'}})
>>>df_test
0          {A, E}
1    {A, S, E, C}
2       {A, C, E}
3    {A, S, E, C}
4          {A, E}
dtype: object

>>>df_test.apply(lambda x: x.add("X"))
0    None
1    None
2    None
3    None
4    None
dtype: object

但是,

>>>df_test
0          {A, X, E}
1    {A, X, S, E, C}
2       {A, X, C, E}
3    {A, X, S, E, C}
4          {A, X, E}
dtype: object

所以 df_test 已更新。但是如果我这样做:

>>> df_test = df_test.apply(lambda x: x.add("X"))
>>> df_test
0    None
1    None
2    None
3    None
4    None
dtype: object

此行为的解释是什么 - 应用正在更新数据帧,但返回的类型为 None。

【问题讨论】:

  • 添加到集合不会返回集合的副本,它会返回 None,并就地修改集合。

标签: python pandas dataframe data-manipulation


【解决方案1】:

您在应用函数内部对 python 集进行操作。使用 add 是对该集合的就地操作,并且它(add 函数)返回 None。 做你想做的事,你可以这样做:

df_test = df_test.apply(lambda x: x |{"X"})

这将返回一个新集合,即每行的原始集合加上 X。

【讨论】:

    【解决方案2】:

    添加到 set 是返回 None 的就地操作,因此在更新系列时,从 apply 返回的副本将在每一行设置None

    如果您真的想在调用 apply 时查看结果,而不是添加到集合中,您可以使用两个集合的并集来获得所需的结果:

    df_test.apply(lambda x: x | {'X'})
    
    0          {A, X, E}
    1    {A, X, E, C, S}
    2       {A, X, E, C}
    3    {A, X, E, C, S}
    4          {A, X, E}
    

    不修改原系列:

    df_test   
    
    0          {A, E}  
    1    {A, E, C, S}  
    2       {A, E, C}  
    3    {A, E, C, S}  
    4          {A, E}  
    

    【讨论】:

    • 不错。可能这是我的无知,但我从来没有遇到过在 python 中使用管道的这种用法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2019-03-15
    • 2017-10-09
    相关资源
    最近更新 更多