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

PooledDataArrayTDataArrayT 的变体,经过优化,可表示包含多次重复的少量唯一值的数组——这在处理分类数据时很常见。

...相当于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:用数组中的字符串替换数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中替换 json 字符串中的数字数组?

用php中的随机数字替换字符串中的奇数位置

用随机数字替换字符串中的每个数字的函数

python pandas用数字替换数据框中的字符串

根据具有 Character 类的字母,用数字替换字符串中的字母

用数组中的0替换空字符串