在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
答案 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
注意:这是一个示例,而不是您完整使用的代码。请修改其余部分,以了解熊猫的这些基本知识:)