python - 使用 Pandas 查找具有 Null 的 2 列之间的差异

标签 python pandas dataframe nan subtraction

我想找出 pandas DataFrame 中两列 int 类型的区别。我正在使用 python 2.7。列如下 -

>>> df
   INVOICED_QUANTITY  QUANTITY_SHIPPED
0                 15               NaN
1                 20               NaN
2                  7               NaN
3                  7               NaN
4                  7               NaN

现在,我想从 INVOICED_QUANTITY 中减去 QUANTITY_SHIPPED,然后执行以下操作-

>>> df['Diff'] = df['QUANTITY_INVOICED'] - df['SHIPPED_QUANTITY']
>>> df
   QUANTITY_INVOICED  SHIPPED_QUANTITY  Diff
0                 15               NaN   NaN
1                 20               NaN   NaN
2                  7               NaN   NaN
3                  7               NaN   NaN
4                  7               NaN   NaN

如何处理 NaN?我希望得到以下结果,因为我希望将 NaN 视为 0(零)-

>>> df
       QUANTITY_INVOICED  SHIPPED_QUANTITY  Diff
    0                 15               NaN   15
    1                 20               NaN   20
    2                  7               NaN   7
    3                  7               NaN   7
    4                  7               NaN   7

我不想做 df.fillna(0)。总而言之,我会尝试类似以下的方法并且它有效但没有区别 -

>>> df['Sum'] = df[['QUANTITY_INVOICED', 'SHIPPED_QUANTITY']].sum(axis=1)
>>> df
   INVOICED_QUANTITY  QUANTITY_SHIPPED  Diff  Sum
0                 15               NaN   NaN   15
1                 20               NaN   NaN   20
2                  7               NaN   NaN    7
3                  7               NaN   NaN    7
4                  7               NaN   NaN    7

最佳答案

您可以使用 sub 方法执行减法 - 此方法允许将 NaN 值视为指定值:

df['Diff'] = df['INVOICED_QUANTITY'].sub(df['QUANTITY_SHIPPED'], fill_value=0)

产生:

   INVOICED_QUANTITY  QUANTITY_SHIPPED  Diff
0                 15               NaN    15
1                 20               NaN    20
2                  7               NaN     7
3                  7               NaN     7
4                  7               NaN     7

另一个巧妙的方法是 @JianxunLi suggests : 填写列中的缺失值(创建列的副本)并照常减去。

这两种方法几乎相同,尽管 sub 效率更高一些,因为它不需要提前生成列的副本;它只是“即时”填充缺失值:

In [46]: %timeit df['INVOICED_QUANTITY'] - df['QUANTITY_SHIPPED'].fillna(0)
10000 loops, best of 3: 144 µs per loop

In [47]: %timeit df['INVOICED_QUANTITY'].sub(df['QUANTITY_SHIPPED'], fill_value=0)
10000 loops, best of 3: 81.7 µs per loop

关于python - 使用 Pandas 查找具有 Null 的 2 列之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31053848/

相关文章:

python - 转换后如何更新数据框的列?

python - 如何通过 python/pandas 中另一个数据框的值来标记数据框列的最有效方式?

python - 检查列表中两个 Dataframe 列中是否存在数据

python - 如何在 python 中绘制图形,如 R 中的 varImpPlot() 方法图,用于绘制随机森林中的重要变量?

python - 在两个 python 列表中查找常见项目的索引

python - 如何在 Python 中根据列值聚合一些行

python - 在 Pandas MultiIndex DataFrame 中选择行

python - 超出时间限制错误。字梯 leetcode

python - 如何将范围字符串(bins)转换为可用于 Seaborn 可视化的数值

python - 如何进行从 JSON 格式到表格格式的特征映射(pop)?