DataFrame-具有条件的按行算术

时间:2018-09-12 09:42:22

标签: python pandas

在VBA(Excel)中,大多数算法必须以循环样式完成。例如。我们要查找列(“ A”)为“ x”的所有行,然后将列(“ A”)为“ y”的行的值添加到该行的另一列。 如何解决像熊猫这样的特定问题?

概括地说:我想遍历DataFrame的每一行,并将其值用作从同一DataFrame中选择另一行并对这些行中的值进行一些数学运算的标准。

在现实生活中的示例:

Sub SomeCode()

Dim vArr As Variant
Dim i As Integer, j As Integer

vArr = Selection

For i = LBound(vArr) + 1 To UBound(vArr)
    If vArr(i, 2) = "S1" Then
        If vArr(i, 8) >= "2019-13" Then
            If vArr(i, 7) = "Chat" Or vArr(i, 7) = "Email" Then
                For j = LBound(vArr) + 1 To UBound(vArr)
                    If vArr(j, 2) = "S1" And vArr(j, 8) = vArr(i, 8) And vArr(j, 6) = vArr(i, 6) Then
                        If vArr(j, 7) = "Phone" Then
                            vArr(j, 9) = vArr(j, 9) + vArr(i, 9) * 0.05
                        ElseIf vArr(j, 7) = "SMS" Then
                            vArr(j, 9) = vArr(j, 9) + vArr(i, 9) * 0.95
                        End If
                    End If
                Next j
                vArr(i, 9) = 0
            End If
        End If
    End If
Next i

Selection = vArr

End Sub

数据集类似于:

ID     Country  Version  Partner  SOME  Location  Site  Channel  Weeknum  contacts 
1099   UK       OP1      0        0     0         0     Email    2019-08  -31
1242   UK       OP1      0        0     0         0     Phone    2019-47  -49
1599   UK       OP1      0        0     0         1     SMS      2019-40  0
1817   UK       OP1      1        1     1         2     SMS      2019-50  0
2539   UK       OP1      0        0     0         3     Chat     2019-44  94
3889   UK       OP1      0        0     0         4     SMS      2019-42  0
4106   UK       OP1      0        0     0         5     SMS      2019-51  -62
4248   UK       S1       2        1     2         6     Email    2019-37  0
5895   UK       S1       1        1     1         2     Email    2019-20  0
6328   UK       S1       0        0     0         7     Email    2019-37  0
6355   UK       S1       0        0     0         7     SMS      2019-12  0
6419   UK       S1       0        0     0         7     Phone    2019-24  0
6486   UK       S1       0        0     0         8     Chat     2019-39  91
6549   UK       S1       0        0     0         8     Email    2019-50  98
6568   UK       S1       0        0     0         8     SMS      2019-17  0
7587   UK       S1       0        0     0         9     Email    2019-48  77
7798   UK       S1       3        1     1         10    Email    2019-51  0
8185   UK       S1       0        0     0         5     Email    2019-22  70
8827   UK       S2       0        0     0         11    Email    2019-40  1
9983   UK       S2       0        0     0         1     Phone    2019-52  70
10193  UK       S2       1        1     3         12    Chat     2019-02  0
11053  UK       S2       0        0     0         13    Chat     2019-30  0
11707  UK       S2       0        0     0         9     Email    2019-08  -27
11859  UK       S2       3        1     1         10    Chat     2019-04  0
12243  UK       S2       0        0     0         4     Phone    2019-24  -77

2 个答案:

答案 0 :(得分:0)

通过使用以下示例,可以很容易地在熊猫中进行行选择:

dfAx = df[df.A == x]

这将选择A列中的值等于x的所有行。 对我来说,您的意思不是很清楚,“然后将列(“ A”)为“ y”的行的值添加到该行的另一列中。但是,例如,您可以选择所有列(“ A”)的值等于y的行,如下所示:

dfAy = df[df.A == y]

之后,您可以在两个数据帧上执行操作。

答案 1 :(得分:0)

pandas中,您可以通过Boolean Indexing对行进行多个条件选择。

例如,以下是您的VBA代码中的部分条件,以pandas的方式完成:

df[((df['Version'] == 'S1') & (df['Weeknum'] == '2019-13'))]

然后可以将其与.loc运算符结合使用以对选定的行执行数学运算:

df.loc[[((df['Version'] == 'S1') & (df['Weeknum'] == '2019-13')), 'contacts'] = df['contacts'] + df['contacts'] * 0.05

注意:这是一个示例,而不是您完整使用的代码。请修改其余部分,以了解熊猫的这些基本知识:)