如何将DataFrame中大于Series的元素替换为该Series对应值?
实现方法
原始数据
给定的DataFrame如下:
a b c 0 1 2 3 1 nan 2 3 2 1 2 nan
预期结果
转换后需要得到:
a b c 0 1 2 3 1 nan 2 2 2 1 2 nan
解决方案
核心思路是先计算每行非缺失值的数量,再将每行中大于该数量的元素替换为对应行的计数。
代码实现
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({ 'a': [1, np.nan, 1], 'b': [2, 2, 2], 'c': [3, 3, np.nan] }) # 计算每行非空值的数量 row_counts = df.count(axis=1) # 利用广播机制进行元素替换 df = df.where(df <= row_counts[:, np.newaxis], row_counts[:, np.newaxis])
代码说明
df.count(axis=1):按行统计非NaN值的个数,得到一个与行数匹配的Series。row_counts[:, np.newaxis]:将一维Series转为二维数组(形状为(3,1)),这样可以和原DataFrame(3行3列)进行广播比较。df.where(cond, other):当cond为True时保留原元素,否则用other的值替换,这里就是把大于行计数的元素替换为计数本身。
另一种实现方式(使用np.where)
如果习惯用numpy的方式,也可以这样写:
df = pd.DataFrame( np.where(df <= row_counts[:, np.newaxis], df, row_counts[:, np.newaxis]), columns=df.columns )
内容的提问来源于stack exchange,提问作者xxyao
相关产品推荐
相关产品推荐

