Julia:用数组中的字符串替换数字
Posted
技术标签:
【中文标题】Julia:用数组中的字符串替换数字【英文标题】:Julia: Replacing a number with a string in an array 【发布时间】:2015-03-06 01:50:03 【问题描述】:我有一个数字(整数或浮点数)值数组(它实际上是 DataFrame 对象中的一列),并且希望将所有 0 实例替换为“NaN”或某些文本。 (或转换 1-->"M" 和 2-->"F"。)
我遇到的问题是,当我写array[i] = "text"
时,我得到了错误:
`convert` has no method matching convert(::TypeInt64, ::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)
的方式相同。
我不认为你可以做一个简单的替换操作,因为DataFrame
中的列的内容必须都是相同的类型。如果您想在同一列中混合数字和字符串,我认为您需要创建一个全新的类型为Union(Number, String)
或类型Any
的列。如果列已经是Any
类型,那么if blah == 0; blah = "NaN"; end
有什么问题(在列的循环内)?
【参考方案1】:
这是一个开始:
df[:sex] = convert(DataArrayUnion(Int64, ASCIIString), 1, df[:sex])
df[df[:sex] .== 1, :sex] = "M"
df[df[:sex] .== 2, :sex] = "F"
【讨论】:
【参考方案2】:也许你最好使用PooledDataArray
:
PooledDataArrayT
:DataArrayT
的变体,经过优化,可表示包含多次重复的少量唯一值的数组——这在处理分类数据时很常见。
...相当于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.PooledDataArraySymbol,Int64,1:
:Male
:Female
:Male
julia> df[:x1] = PooledDataArray(DataArrays.RefArray(df[:x1]), [:Male, :Female])
3-element DataArrays.PooledDataArraySymbol,Int64,1:
:Male
:Female
:Male
julia> df
3x2 DataFrames.DataFrame
| Row | x1 | x2 |
|-----|--------|----|
| 1 | Male | 3 |
| 2 | Female | 4 |
| 3 | Male | 6 |
注意:这是有效的,因为参考数组包含从 1 到标签大小 (2) 的值。
【讨论】:
以上是关于Julia:用数组中的字符串替换数字的主要内容,如果未能解决你的问题,请参考以下文章