[英]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.