簡體   English   中英

如何用整個 dataframe 中的列組的平均值替換字符串值

[英]How to replace a string value with the means of a column's groups in the entire dataframe

我有一個包含 400 列和 30,000 行的大型數據集。 數據集全是數字,但有些列中有奇怪的字符串值(表示為“#?”)而不是空白。 這會更改具有“#?”的列的 dtypes 進入 object 類型。 (150 列 object dtype)

我需要將所有列轉換為 float 或 int dtypes,然后使用列的組填充數據中的正常 NaN 值。 (例如:每列中 X 的平均值,Y 的平均值)

col1 col2 col3
X    21    32 
X    NaN   3
Y    Nan   5 

我的最終目標是將其應用於整個數據:

df.groupby("col1").transform(lambda x: x.fillna(x.mean()))

但我不能將此應用於具有“#?”的列在它們中,它們被丟棄。 我嘗試替換 #? 使用數值,然后將所有列轉換為 float dtype,這可行,但替換的值也應包含在上述代碼中。

我想過更換#? 具有像 -123.456 這樣的奇怪值,這樣它就不會與實際數據點混合,並且可能將所有 -123.456 替換為列組的平均值,但需要將 -123.456 從平均值中排除。 但我只是不知道這將如何運作。 如果我再次將其轉換回 NaN,則 dtype 會變回 object。

我認為 go 最好的方法是直接替換#? 與列組的意思。

有任何想法嗎?

編輯:我太笨了哈哈

df=df.replace('#?', '').astype(float, errors = 'ignore')

這行得通。

利用:

print (df)
  col1 col2  col3
0    X   21    32
1    X   #?     3
2    Y  NaN     5

df = (df.set_index('col1')
        .replace(r'#\?', np.nan, regex=True)
        .astype(float)
        .groupby("col1")
        .transform(lambda x: x.fillna(x.mean())))
print (df)
      col2  col3
col1            
X     21.0  32.0
X     21.0   3.0
Y      NaN   5.0

暫無
暫無

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

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