Excel - Как найти количество раз, когда строки появляются в столбце - PullRequest
0 голосов
/ 10 мая 2018

Это мой первый пост, я все еще новичок в Excel!

Я создал скрипт на python, который очищает диаграммы Billboard Hip Hop / R & B и заполняет данные в таблицу Excel. Мои данные выглядят так:

Заголовки: Номер рекламного щита, Имя исполнителя и Название песни .

1  Drake                                          Nice For What               
2  Post Malone Featuring Ty Dolla $ign            Psycho                      
3  Drake                                          God's Plan                  
4  Post Malone                                    Better Now                  
5  Post Malone Featuring 21 Savage                Rockstar                    
6  BlocBoy JB Featuring Drake                     Look Alive                  
7  Post Malone                                    Paranoid                    
8  Lil Dicky Featuring Chris Brown                Freaky Friday               
9  Post Malone                                    Rich & Sad                  
10 Post Malone Featuring Swae Lee                 Spoil My Night              
11 Post Malone Featuring Nicki Minaj              Ball For Me                 
12 Migos Featuring Drake                          Walk It Talk It             
13 Post Malone Featuring G-Eazy & YG              Same Bitches                
14 Cardi B| Bad Bunny & J Balvin                  I Like It                   
15 Post Malone                                    Zack And Codeine            
16 Post Malone                                    Over Now                    
17 Cardi B                                        Be Careful                  
18 Post Malone                                    Takin' Shots                
19 The Weeknd & Kendrick Lamar                    Pray For Me                 
20 Rich The Kid                                   Plug Walk                   
21 The Weeknd                                     Call Out My Name            
22 Bruno Mars & Cardi B                           Finesse                     
23 Post Malone                                    Candy Paint                 
24 Ella Mai                                       Boo'd Up                    
25 Rae Sremmurd & Juicy J                         Powerglide                  
26 Post Malone                                    92 Explorer                 
27 J. Cole                                        ATM                         
28 J. Cole                                        KOD                         
29 Post Malone                                    Otherside                   
30 Post Malone                                    Blame It On Me              
31 J. Cole                                        Kevin's Heart               
32 Kendrick Lamar & SZA                           All The Stars               
33 Nicki Minaj                                    Chun-Li                     
34 Lil Pump                                       Esskeetit                   
35 Migos                                          Stir Fry                    
36 Famous Dex                                     Japan                       
37 Post Malone                                    Sugar Wraith                
38 Cardi B Featuring Migos                        Drip                        
39 XXXTENTACION                                   Sad!                        
40 Jay Rock| Kendrick Lamar| Future & James Blake King's Dead                 
41 Rich The Kid Featuring Kendrick Lamar          New Freezer                 
42 Logic & Marshmello                             Everyday                    
43 J. Cole                                        Motiv8                      
44 YoungBoy Never Broke Again                     Outside Today               
45 Post Malone                                    Jonestown (Interlude)       
46 Cardi B Featuring 21 Savage                    Bartier Cardi               
47 YoungBoy Never Broke Again                     Overdose                    
48 J. Cole                                        1985 (Intro To The Fall Off)
49 J. Cole                                        Photograph                  
50 Khalid| Ty Dolla $ign & 6LACK                  OTW

Я хочу подсчитать общее количество раз, когда артист появляется под Имя исполнителя , в том числе, если они присутствовали в песне, а также отображать композицию с топ-графиком. Например:

Заголовки Имя исполнителя, внешний вид Billboard и Лучшая песня .

Post Malone                          17           Psycho
J.Cole                               6            ATM
Cardi B                              5            I Like It
Drake                                4            Nice For What
Migos                                3            Walk It Talk It
YoungBoy Never Broke Again           2            Outside Today
Rich The Kid                         2            Plug Walk
21 Savage                            2            Rockstar
...

Как мне этого добиться?

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Сложнее всего очистить данные, чтобы получить уникальный список имен артистов.

Изучая ваш список, кажется, что если для одной песни указано несколько имен исполнителей, они будут разделены Featuring, & или |

Если это всегда так, вы можете использовать макрос VBA для разделения имен, а затем использовать словарь для сбора списка имен.

Когда вы создаете этот список, тривиально получить также количество раз, когда появляется исполнитель, а также песню с самым высоким рейтингом (это будет песня, связанная с первым экземпляром этого имени).

Мы используем определенный пользователем объект (класс) для хранения информации и собираем эти объекты в словарь, связанный с именем исполнителя.

Обратите внимание, что мы читаем данные листа в массив VBA и выполняем итерацию по массиву. Обычно это выполняется на порядок быстрее, чем итерация по фактическому рабочему листу.

Чтобы получить отчет, мы должны вывести результаты на рабочий лист.

Модуль класса

Option Explicit
'Class module **RENAME**: cArtist
Public Cnt As Long
Public Song As String

Обычный модуль

Option Explicit
Option Compare Text
Sub Artists()
    Dim dA As Dictionary, cA As cArtist
    Dim vSrc, vRes
    Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
    Dim V, W, X, Y, Z, A, B
    Dim I As Long
    Dim sKey As String

Set wsSrc = Worksheets("sheet6")
With wsSrc
    vSrc = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp)).Resize(columnsize:=2)
End With

Set wsRes = Worksheets("sheet6")
    Set rRes = wsRes.Cells(1, 6)

Set dA = New Dictionary
For I = 1 To UBound(vSrc, 1)
    W = Split(vSrc(I, 1), "Featuring")
        For Each X In W
            Y = Split(X, "|")
                For Each Z In Y
                    A = Split(Z, "&")
                        For Each B In A
                            sKey = Trim(B)
                            Set cA = New cArtist
                            With cA
                                .Cnt = 1
                                .Song = Trim(vSrc(I, 2))
                            End With
                            If Not dA.Exists(sKey) Then
                                dA.Add Key:=sKey, Item:=cA
                            Else
                                dA(sKey).Cnt = dA(sKey).Cnt + 1
                            End If
                        Next B
                Next Z
        Next X
Next I

ReDim vRes(0 To dA.Count, 1 To 3)
    vRes(0, 1) = "Artist Name"
    vRes(0, 2) = "Billboard Appearances"
    vRes(0, 3) = "Top Song"

I = 0
For Each V In dA.Keys
    I = I + 1
    With dA(V)
        vRes(I, 1) = V
        vRes(I, 2) = .Cnt
        vRes(I, 3) = .Song
    End With
Next V

Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    .Sort key1:=rRes(1, 2), order1:=xlDescending, key2:=rRes(1, 1), order2:=xlAscending, MatchCase:=False, Header:=xlYes
    .Style = "Output"
    With .Columns(2)
        .ColumnWidth = .ColumnWidth / 2
        .WrapText = True
        .HorizontalAlignment = xlCenter
    End With
    With .Rows(1)
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
    End With
    .EntireColumn.AutoFit
End With
End Sub

Вывод с учетом вашего ввода выше

enter image description here

0 голосов
/ 10 мая 2018

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

Чтобы получить список уникальных исполнителей, скопируйте список ваших данных в новое место в вашей электронной таблице.,Затем выберите все свои данные и запустите функцию «Удалить дубликаты» (на вкладке «Данные»), выбрав колонку исполнителя.Это даст вам список всех уникальных исполнителей и даст вам лучшую песню для загрузки.

Теперь все эти X с именами Y исполнителей будут уникальными, поэтому вам нужно будет отфильтровать их еще немного.Найдите слово компоновщика «Featuring» с функцией Find и используйте его в сочетании с функцией Left, чтобы получить только первого исполнителя.Примерно так: =IFERROR(LEFT(I3,FIND("Featuring",I3)-2),I3) Эта функция использует функцию iferror для передачи имен, в которых нет слова «Featuring».Затем сделайте то же самое с полученным столбцом для & и |и это даст вам довольно чистый список отдельных исполнителей.

Чтобы получить избранных исполнителей, сделайте аналогичную вещь, используя функцию Right вместо функции Left.

После того, как вы получите этот чистыйсписок сделать фильтр уникальных художников снова, чтобы сжать его.Оттуда вы можете использовать это с вашим vlookup или найти функции, чтобы начать считать.

0 голосов
/ 10 мая 2018

Вы можете использовать Power Query (Get & Transform Data) для управления вашей таблицей:

let

    Source = Excel.CurrentWorkbook(){[Name="tbInput"]}[Content],

    #"Changed Type" = Table.TransformColumnTypes(
        Source,
        {{"Billboard Number", Int64.Type}, 
         {"Artist Name", type text}, 
         {"Song Title", type text}}),

    #"Split Column by Delimiters" = Table.ExpandListColumn(
        Table.TransformColumns(
            #"Changed Type",
            {{"Artist Name", Splitter.SplitTextByAnyDelimiter({"Featuring","|","&"}, QuoteStyle.None), 
            let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), 
            "Artist Name"),

    #"Trimmed Text" = Table.TransformColumns(
        #"Split Column by Delimiters",
        {{"Artist Name", Text.Trim, type text}}),

    #"Artist Highest Position" = Table.Group(
        #"Trimmed Text", 
        {"Artist Name"}, 
        {{"Highest Position", each List.Min([Billboard Number]), 
        type number}}),

    #"Merge 1" = Table.NestedJoin(
        #"Artist Highest Position",
        {"Artist Name", "Highest Position"},
        #"Trimmed Text",
        {"Artist Name", "Billboard Number"},
        "Merged",
        JoinKind.LeftOuter),

    #"Highest Song" = Table.ExpandTableColumn(
        #"Merge 1", "Merged", {"Song Title"}, {"Song Title"}),

    #"Artist Count" = Table.Group(
        #"Trimmed Text", 
        {"Artist Name"}, 
        {{"Count", each Table.RowCount(_), type number}}),

    #"Merge 2" = Table.NestedJoin(
        #"Artist Count",
        {"Artist Name"},
        #"Highest Song",
        {"Artist Name"},
        "Merged",
        JoinKind.LeftOuter),

    #"Expanded Merged" = Table.ExpandTableColumn(
        #"Merge 2", "Merged", {"Song Title"}, {"Song Title"}),

    #"Sorted Rows" = Table.Sort(#"Expanded Merged",{{"Count", Order.Descending}})

in

    #"Sorted Rows"

Что дает вывод:

Output Table

0 голосов
/ 10 мая 2018

Если у вас уже есть все имена исполнителей, используйте countif и vlookup с wildcard.

enter image description here

пс. Убедитесь, что имена ваших артистов верны. Ваш пример данных J.cole не содержит пробелов, он вернет неправильный результат.

...