簡體   English   中英

基於列名的加法在一個巨大的 dataframe pandas

[英]Addition based on the column name in a huge dataframe pandas

我在alldata dataframe 中有數千列。 列名由A_B_CA_B_D等元素組成。 我已經在同一個 dataframe 和其他數據幀中分別有ABCdf_Adf_Bdf_Cdf_D

迭代以獲得 A、B 和 C 的總和並檢查它們是否 A、B、C 或 A、B、D 的總和列表在任何行上都小於 0,因為它看起來不是一個好主意無限時間。 不確定問題出在哪里。

這是我的代碼。 應該如何優化?

res1A_B_C等的組合列表

    for i in res1:
        x = i.split("_")
        alldata['sum'] = alldata[x[0]]+alldata[x[1]]+alldata[x[2]]
        if sum(n < 0 for n in alldata['sum']) >0:
            c=""
            print("nah")
        else:
            nice = [x[0],x[1],x[2]]
            good = good.append(nice)
            print(nice)
        alldata = alldata.drop([i], axis=1)
        print("dropped," + str(len(alldata.columns)) + "columns remaining")

讓我們逐行看看你的代碼在做什么:

res1 = ['A_B_C', 'A_B_D']
for i in res1:

你的實際res1有多長? 如果它很長(數千),這個for循環總是需要一段時間。 順便說一句,對於多部分字符串, i是一個糟糕的變量名( grouped_names或其他東西怎么樣?)。

    x = i.split("_")

假設每個字符串都像您的示例一樣短,那根本不會花費太多時間。

    alldata['sum'] = alldata[x[0]] + alldata[x[1]] + alldata[x[2]]

好消息是上面是矢量化的,因此它將以本機速度運行(因為 Pandas 系列的添加和分配是在編譯代碼中實現的)。 但是alldata有多少行? 這是上述線路性能的主要因素。

    if sum(n < 0 for n in alldata['sum']) > 0:
        c=""
        print("nah")

您不要在其他任何地方使用c ,請將其刪除。 印刷聲明是關於什么的? 我也會刪除它。

    else:
        nice = [x[0],x[1],x[2]]
        good = good.append(nice)
        print(nice)

只需說nice = x[:3]來獲取前三個元素,而不是創建一個新列表。

    alldata = alldata.drop([i], axis=1)

這似乎不太好。 您每次都在創建一個新的 DataFrame,而是:這個怎么樣:

    drop_cols.append(i)

然后在最后執行alldata.drop(drop_cols, axis=1, inplace=True)一次。

    print("dropped," + str(len(alldata.columns)) + "columns remaining")

您可以稍微簡化一下:

    print("dropped,", len(alldata.columns), "columns remaining")

一旦你嘗試了上述方法,讓我們知道代碼在一些合理大小的 DataFrame (其中包含真實數據,但可能不是所有行)上需要多長時間。 然后告訴我們你需要多少加速才能使解決方案可接受。

我認為@John Zwinck 涵蓋了所有正確的觀點......

建議使用 df.apply() 求和,然后在發現第一個故障時發出raise Exception停止,因此應該加快故障速度。 如果所有成功,那么 df 的總和是更好的方法,IMO。

def testColumns(row, colName):
    s_ = sum(r[c] for c in colName.split('_')) 
    if s_ < 0 : 
        raise Exception 'nah'
    return True

for col in columnSet:
    sName = 's_'%str(col)
    try: 
        df[sName] = df.apply(lambda r : testColumns(r, col), axis=1 )
        msg = "col Kept  "
        nice = colName.split('_')
        good.append(nice)
    except Exception as err:
        msg = "col dropped"
        alldata.drop([col, sName], axis=1, inplace=True)
    print(msg, str(len(alldata.columns)) + "columns remaining")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM