繁体   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