使用相应列的最频繁的非Null项替换所有数据框列中的NULL和空值

时间:2017-10-18 17:05:45

标签: python pandas

我是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

2 个答案:

答案 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