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