Чтобы получить соответствующее максимальное число из строки

Вы можете использовать конструктор DataFrame с lists, созданный путем преобразования в numpy array с помощью values с tolist :

import pandas as pd

d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
                ['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
       teams
0  [SF, NYG]
1  [SF, NYG]
2  [SF, NYG]
3  [SF, NYG]
4  [SF, NYG]
5  [SF, NYG]
6  [SF, NYG]

df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
print (df2)
       teams team1 team2
0  [SF, NYG]    SF   NYG
1  [SF, NYG]    SF   NYG
2  [SF, NYG]    SF   NYG
3  [SF, NYG]    SF   NYG
4  [SF, NYG]    SF   NYG
5  [SF, NYG]    SF   NYG
6  [SF, NYG]    SF   NYG

И для нового DataFrame:

df3 = pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
print (df3)
  team1 team2
0    SF   NYG
1    SF   NYG
2    SF   NYG
3    SF   NYG
4    SF   NYG
5    SF   NYG
6    SF   NYG

Решение с apply(pd.Series) очень медленно:

#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)

In [89]: %timeit df2['teams'].apply(pd.Series)
1 loop, best of 3: 1.15 s per loop

In [90]: %timeit pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
1000 loops, best of 3: 820 µs per loop

0
задан skkakkar 15 January 2019 в 17:08
поделиться

3 ответа

Без Regex:

Public Function maxNums(str As String) As Double
    Dim i As Long, L As Long, s As String, wf As WorksheetFunction, brr()
    Set wf = Application.WorksheetFunction
    L = Len(str)

    For i = 1 To L
        s = Mid(str, i, 1)
        If s Like "[0-9]" Or s = "." Then
        Else
            Mid(str, i, 1) = " "
        End If
    Next i

    str = wf.Trim(str)
    arr = Split(str, " ")

    ReDim brr(LBound(arr) To UBound(arr))

    For i = LBound(arr) To UBound(arr)
        brr(i) = CDbl(arr(i))
    Next i

    maxNums = wf.Max(brr)
End Function

enter image description here

0
ответ дан Gary's Student 15 January 2019 в 17:08
поделиться

В вашем коде есть одна или две проблемы. Во-первых, регулярное выражение не ищет десятичные числа. Если вы измените его на

.Pattern = "\d+\.?(\d?)+"

, он будет работать лучше. Вкратце:
\ d + = хотя бы одна цифра
. = Необязательная точка
(\ d?) + = Необязательные числа

Это не водостойкое выражение, но оно работает в некоторой степени, по крайней мере.

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

0
ответ дан Sam 15 January 2019 в 17:08
поделиться

Если его всегда x = число , я думаю, что проще зацикливаться на каждом значении с разделителями, затем прочитать значение = для значения:

Function MaxValue(data As String)
    Dim i As Long, value As Double
    Dim tokens() As String: tokens = Split(data, ",")

    For i = 0 To UBound(tokens)
        '// get the value after = as a double
        value = CDbl(Trim$(Mid$(tokens(i), InStr(tokens(i), "=") + 1)))
        If (value > MaxValue) Then MaxValue = value
    Next
End Function
0
ответ дан Alex K. 15 January 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: