【问题标题】:Using apply() on different columns with different functions on each column of a dataframe在数据框的每一列上使用具有不同功能的不同列上的 apply()
【发布时间】:2019-09-28 10:00:19
【问题描述】:

我有一个DataFrame,其列名称为age,salary。还有一些NaN 值。我想使用MeanMedian 填充这些值。

原始数据帧


age salary
0   20.0    NaN
1   45.0    22323.0
2   NaN 598454.0
3   32.0    NaN
4   NaN 48454.0

使用apply() 用mean()salary 填充缺失的age 和它们各自列的median()

我用过

df['age','salary'].apply({'age':lambda row:row.fillna(row.mean()), 'salary':lambda row:row.fillna(row.median()) })

即使在我使用axis=1 之后,它仍显示Key error 'age','salary'

预期输出

    age salary
0   20.000000   48454.0
1   45.000000   22323.0
2   32.333333   598454.0
3   32.000000   48454.0
4   32.333333   48454.0

有人可以告诉我如何正确执行此操作以及后台发生的情况吗?

请告知是否还有其他方法。我正在从头开始学习 Pandas

【问题讨论】:

  • 嘿 Deshwal,您能发布一个数据示例和预期输出吗?
  • @Datanovice 当然。我已经更新了。请看一下

标签: python pandas dataframe apply series


【解决方案1】:

在运行 apply 之前计算缺失值怎么样?也就是说,计算age 的平均值和salary 的中位数,然后使用(注意在多列上操作需要额外的[] 括号)

median_salary = df['salary'].median()
mean_age = df['age'].mean()

df[['age','salary']].apply({'age': lambda r: r.fillna(mean_age), 'salary': lambda r: r.fillna(median_salary)}) 

另请注意,这不会影响数据框,而是会创建一个新数据框,因此如果您想更新列,请使用以下内容:

df[['age', 'salary']] = df[['age', 'salary']].apply(...)

或者,在您只想填写缺失值的情况下,最好的解决方案可能是:

r.fillna({'age': mean_age, 'salary': median_salary}, inplace=True)

【讨论】:

  • 谢谢你!您刚刚提供的这些知识很有用。
【解决方案2】:

根据documentation,您要求的最简单方法是将字典作为value 参数传递:

值:标量、字典、系列或数据帧

用于填充空洞的值(例如 0),或者一个 dict/Series/DataFrame 值,指定每个值使用哪个值 索引(对于系列)或列(对于 DataFrame)。不在范围内的值 dict/Series/DataFrame 不会被填充。此值不能是列表。

在你的情况下,代码将是下一个:

df.fillna(value={'age': df.age.mean(), 'salary': df.salary.median()}, inplace=True)

并给出:

         age    salary
0  20.000000   48454.0
1  32.333333   22323.0
2  45.000000  598454.0
3  32.333333   48454.0
4  32.000000   48454.0
5  32.333333   48454.0

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2021-12-14
    • 2021-03-12
    相关资源
    最近更新 更多