Julia:在数组中将数字替换为字符串

5
我有一个数字数组(整数或浮点数),它实际上是DataFrame对象中的一列,我想替换所有0的实例为“NaN”或某些文本。(或将1-》“M”和2-》“F”进行转换。)
但是当我写array[i] = "text"时,我遇到了问题,出现错误:
`convert` has no method matching convert(::Type{Int64}, ::ASCIIString)

我该怎么解决这个问题?另外,有什么最有效的方法可以达到 Pandas 的 df.column.replace({1:"M", 2:"F"}, inplace=True) 的效果吗?

我尝试了以下代码:

df[:sex] = [ {1 => "M", 2 => "F"}[i] for i in df[:sex] ]

...但当我只替换一些值时,就会出现问题(这时会出现“找不到键X”的错误,因为我传递了一个不在字典中的值 [:sex])。


我不知道是否有更加朱利安式的替换列方法,但是你可以使用 get 方法 -- 即 get(replace_dict, i, i) -- 来避免在 Python 中使用 replace_dict.get(i, i) 时出现缺失键错误。 - DSM
我认为你不能进行简单的替换操作,因为DataFrame中列的内容必须全部是相同类型。如果你想在同一列中混合数字和字符串,我认为你需要创建一个完全新的类型为Union(Number, String)Any的列。如果该列已经是Any类型,则在列下降循环中使用if blah == 0; blah = "NaN"; end有什么问题吗? - Colin T Bowers
2个回答

2

以下是一个开始:

df[:sex] = convert(DataArray{Union(Int64, ASCIIString), 1}, df[:sex])

df[df[:sex] .== 1, :sex] = "M"
df[df[:sex] .== 2, :sex] = "F"

1
也许您最好使用PooledDataArray

PooledDataArray{T}:一种DataArray{T}的变体,用于优化表示包含许多重复的少量唯一值的数组,这在处理分类数据时通常发生。

...它相当于pandas/R中的Categorical。


julia> df = DataFrame([1 3; 2 4; 1 6])
3x2 DataFrames.DataFrame
| Row | x1 | x2 |
|-----|----|----|
| 1   | 1  | 3  |
| 2   | 2  | 4  |
| 3   | 1  | 6  |

julia> PooledDataArray(DataArrays.RefArray(df[:x1]), [:Male, :Female])
3-element DataArrays.PooledDataArray{Symbol,Int64,1}:
 :Male
 :Female
 :Male

julia> df[:x1] = PooledDataArray(DataArrays.RefArray(df[:x1]), [:Male, :Female])
3-element DataArrays.PooledDataArray{Symbol,Int64,1}:
 :Male
 :Female
 :Male

julia> df
3x2 DataFrames.DataFrame
| Row | x1     | x2 |
|-----|--------|----|
| 1   | Male   | 3  |
| 2   | Female | 4  |
| 3   | Male   | 6  |

注意:这有效是因为参考数组包含从1到标签大小(2)的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接