python - 数据帧交替数组

标签 python excel vba pandas

我目前有一个包含如下信息的 excel 文件:

Company Initial     Purchase Number
ABCD            A123456789
ABCD            B123456789
BCDE            C123456789
BCDE            D123456789
BCDE            E123456789
CDEF            F123456789
DEFG            G123456789
DEFG            H123456789
DEFG            I123456789
DEFG            J123456789
DEFG            K123456789

我想把它变成一个表格,这样同一个公司的首字母就不会连续重复。

Company Initial     Purchase Number
DEFG            K123456789
ABCD            A123456789
DEFG            G123456789
ABCD            B123456789
DEFG            J123456789
BCDE            C123456789
DEFG            I123456789
BCDE            D123456789
DEFG            H123456789
BCDE            E123456789
CDEF            F123456789

我目前正在 Pandas 和 VBA 中尝试这个,但似乎无法找到一个可行的解决方案。我也对其他 Python 库持开放态度。

谢谢。

最佳答案

借助内存中的列表框的另一种可能性:

Sub Reshuffle()
Dim Arr As Variant, FreqArr As Variant, Place As Long, Comp1 As Variant, Comp2 As Variant
Dim rngArr As Range, i As Long, j As Long, k As Long, ListB1 As MSForms.ListBox, ListB2 As MSForms.ListBox

Set ListB1 = CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
Set ListB2 = CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")

 Set rngArr = Range("A2:B12")

    With ListB1
        .Column = Application.Transpose(rngArr)
         ListB2.List = .List
                For i = LBound(.List) To UBound(.List)
                    Arr = Application.Match(Application.Transpose(Application.Index(.List, 0, 1)), Application.Index(.List, 0, 1), 0)
                    FreqArr = Application.Frequency(Arr, Arr)
                        If Application.Max(FreqArr) > (UBound(.List) + 2) / 2 Then MsgBox "not possible"
                            For j = 1 To UBound(.List) + 1
                                Place = Application.Match(Application.Large(FreqArr, j), FreqArr, 0)
                                Comp2 = .List(Place - 1, 0)
                                    If Comp2 <> Comp1 Then Exit For
                            Next j
                                Comp1 = Comp2
                                    With ListB2
                                        For k = LBound(.List, 2) To UBound(.List, 2)
                                            .List(i, k) = ListB1.List(Place - 1, k)
                                        Next k
                                        ListB1.RemoveItem Place - 1
                                    End With
                Next i
      End With
rngArr.Value = ListB2.List 'replaces in same range

Set ListB1 = Nothing
Set ListB2 = Nothing

End Sub

关于python - 数据帧交替数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57250320/

相关文章:

python - 为一个键分配多个值?

sql-server - SQL 转 GROUP BY 计算日期

php - 使用 PHPExcel_RichText() 不会显示换行符

python - 使用列表中的名称创建数据框

excel - 删除重复的 VBA 脚本字典

vba - 如何显示单元格值偏移事件单元格

Python ImageFont 和 ImageDraw 检查字符支持的字体

Python - 创建具有动态大小的文本边框

wcf - Excel-VBA REST WCF 在第一次调用时工作,但后续调用返回缓存的(非当前)数据

python Pandas : transform dataframe adding grouped columns