DataFrame - строковая арифметика с критериями - PullRequest
0 голосов
/ 12 сентября 2018

в 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 голосов
/ 12 сентября 2018

В pandas вы можете сделать несколько условий выбора строк с помощью Булева индексация .

Например, вот некоторые из ваших условий из вашего кода 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

Примечание Это пример, а не ваш полный адаптированный код.Пожалуйста, адаптируйте остальную часть этого, понимая эти основы панд:)

0 голосов
/ 12 сентября 2018

Выбор строк в пандах можно сделать довольно просто, например, используя:

dfAx = df[df.A == x]

. Выбирает все строки, для которых значение в столбце A равно x.Мне не совсем понятно, что вы имеете в виду, когда «добавьте в другой столбец в этой строке значение из строки, где столбец (« A ») равен« y »».Но вы можете, например, просто выбрать все строки, для которых значение столбца ("A") равно y, например:

dfAy = df[df.A == y]

После этого вы можете выполнять операции на обоих фреймах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...