2017-10-18 58 views
0

我是Python的新手 - 我試圖替換NULL和空值('')值在列熊貓數據框與該列中最頻繁的項目。但我需要能夠爲數據框的所有列和所有行執行此操作。我寫了下面的代碼 - 但它需要很多時間來執行。你能幫我優化嗎?替換所有數據幀列中NULL和空值的相應列中最頻繁的Non Null項

感謝 Saptarshi

for column in df: 
    #Get the value and frequency from the column 
    tempDict = df[column].value_counts().to_dict() 

    #pop the entries for 'NULL' and '?' 
    tempDict.pop(b'NULL',None) 
    tempDict.pop(b'?',None) 

    #identify the max item of the remaining set 
    maxItem = max(tempDict) 

    #The next step is to replace all rows where '?' or 'null' appears with maxItem 
    #df_test[column] = df_test[column].str.replace(b'NULL', maxItem) 
    #df_test[column] = df_test[column].str.replace(b'?', maxItem) 
    df[column][df[column] == b'NULL'] = maxItem 
    df[column][df[column] == b'?'] = maxItem 
+0

當沒有「最頻繁」項目時(即所有值爲空,或者當多個項目並列時),您想要什麼行爲? – ASGM

回答

0

您可以使用mode()找到每列最常見的值:

for val in ['', 'NULL', '?']: 
    df.replace(val, df.mode().iloc[0]) 

因爲可能有多個模態值,mode()返回一個數據幀。使用.iloc[0]將從該數據幀中獲取第一個值。您可以使用fillna()而不是replace(),如果您還想將NaN值轉換爲@Wen。

0

我在這裏創建一個示例數據。

df = pd.DataFrame({'col1': [6,3,'null',4,4,2,'?'], 'col2': [6,3,2,'null','?',2,2]}) 
df.replace({'?':np.nan},inplace=True) 
df.replace({'null':np.nan},inplace=True) 
df.fillna(df.apply(lambda x : x.mode()[0])) 

Out[98]: 
    col1 col2 
0 6.0 6.0 
1 3.0 3.0 
2 4.0 2.0 
3 4.0 2.0 
4 4.0 2.0 
5 2.0 2.0 
6 4.0 2.0 
+0

欣賞詳細的解釋 - 謝謝,這真是一個偉大的社區 –

相關問題