【问题标题】:Conditional column arithmetic in pandas dataframe熊猫数据框中的条件列算术
【发布时间】:2015-01-28 10:56:58
【问题描述】:

我有一个具有以下结构的熊猫数据框:

import numpy as np
import pandas as pd
myData = pd.DataFrame({'x': [1.2,2.4,5.3,2.3,4.1], 'y': [6.7,7.5,8.1,5.3,8.3], 'condition':[1,1,np.nan,np.nan,1],'calculation': [np.nan]*5})

print myData

   calculation  condition    x    y
0          NaN          1  1.2  6.7
1          NaN          1  2.4  7.5
2          NaN        NaN  5.3  8.1
3          NaN        NaN  2.3  5.3
4          NaN          1  4.1  8.3

我想根据“x”和“y”中的值(例如 x/y)在“计算”列中输入一个值,但仅限于“条件”列包含 NaN 的单元格中(np.isnan (myData['condition'])。最终的数据框应如下所示:

   calculation  condition    x    y
0          NaN          1  1.2  6.7
1          NaN          1  2.4  7.5
2        0.654        NaN  5.3  8.1
3        0.434        NaN  2.3  5.3
4          NaN          1  4.1  8.3

我很高兴使用“for”循环依次遍历每一行,然后使用“if”语句进行计算,但我拥有的实际数据框非常大,我想在基于数组的方式。这可能吗?我想我可以计算所有行的值,然后删除我不想要的行,但这似乎浪费了很多精力(NaN 在数据框中非常少见),并且在某些情况下,“条件”等于 1 , 因被零除而无法计算。

提前致谢。

【问题讨论】:

    标签: python numpy pandas dataframe


    【解决方案1】:

    EdChum 的回答对我很有效!不过,我想扩展这个线程,因为我认为它对其他人有用。

    假设您的数据框是

              c     x    y
    0         1   1.2  6.7
    1         1   2.4  7.5
    2         0   5.3  8.1
    3         0   2.3  5.3
    4         1   4.1  8.3
    

    并且您想用关联的 x/y 更新列 c 中的 0。

              c     x    y
    0         1   1.2  6.7
    1         1   2.4  7.5
    2      0.65   5.3  8.1
    3      0.43   2.3  5.3
    4         1   4.1  8.3
    

    你可以的

    myData['c'] = (myData['x']/myData['y']).where(cond=myData['c']==0, other=myData['c'])
    

    myData['c'].where(cond=myData['c'] != 0, other=myData['x']/myData['y'], inplace=True)
    

    在不满足 'cond' 的两种情况下,都会执行 'other'。在第二个代码 sn-p 中,inplace 标志也可以很好地工作(就像在第一个代码 sn-p 中一样。)

    我从pandas official site "where"pandas official site "indexing" 找到了这些解决方案

    这种操作正是我最需要的。我是 Pandas 的新手,我花了一段时间才找到这个有用的线程。谁能推荐一些综合教程来练习这些类型的算术运算?我需要“过滤/分组/切片数据帧,然后分别或一次将不同的功能/操作应用于每个组/切片,并将其全部保留。”干杯!

    【讨论】:

      【解决方案2】:

      使用where 并将您的条件传递给它,这将只在行满足条件时执行您的计算:

      In [117]:
      
      myData['calculation'] = (myData['x']/myData['y']).where(myData['condition'].isnull())
      myData
      Out[117]:
         calculation  condition    x    y
      0          NaN          1  1.2  6.7
      1          NaN          1  2.4  7.5
      2     0.654321        NaN  5.3  8.1
      3     0.433962        NaN  2.3  5.3
      4          NaN          1  4.1  8.3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-20
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多