[英]Addition based on the column name in a huge dataframe pandas
我在alldata
dataframe 中有數千列。 列名由A_B_C
或A_B_D
等元素組成。 我已經在同一個 dataframe 和其他數據幀中分別有A
, B
, C
和df_A
, df_B
, df_C
, df_D
迭代以獲得 A、B 和 C 的總和並檢查它們是否 A、B、C 或 A、B、D 的總和列表在任何行上都小於 0,因為它看起來不是一個好主意無限時間。 不確定問題出在哪里。
這是我的代碼。 應該如何優化?
res1
是A_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.