我是Python的新手 - 我试图用该列中最频繁的项替换在Pandas数据框的列中出现的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 :(得分:0)
您可以使用mode()
查找每列中最常见的值:
for val in ['', 'NULL', '?']:
df.replace(val, df.mode().iloc[0])
因为可能有多个模态值,mode()
会返回一个数据帧。使用.iloc[0]
从该数据帧中获取第一个值。如果您还要转换fillna()
值,则可以使用replace()
代替NaN
,如@Wen所做的那样。
答案 1 :(得分: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