这可能是一个愚蠢的问题,但对于我的生活,我无法弄清楚如何让Julia读取一个csv文件,其列名以数字开头并在DataFrames中使用。如何做到这一点?
例如,假设我有文件" test.csv"其中包含以下内容:
,1Y,2Y,3Y
1Y,11,12,13
2Y,21,22,23
如果我只使用readtable(),我会得到这个:
julia> using DataFrames
julia> df = readtable("test.csv")
2x4 DataFrames.DataFrame
| Row | x | x1Y | x2Y | x3Y |
|-----|------|-----|-----|-----|
| 1 | "1Y" | 11 | 12 | 13 |
| 2 | "2Y" | 21 | 22 | 23 |
是什么给出的?如何让列名成为他们应该是的," 1Y," 2Y等?
答案 0 :(得分:4)
问题在于,在DataFrame中,列名称为symbols,这并不意味着(请参阅下面的评论)以数字开头。
您可以通过以下方式查看: typeof(:2)
,将返回Int64
,而不是(正如您所料)Symbol
。因此,要使您的列名成为可用格式,DataFrames必须在其前面添加一个字母 - typeof(:x2)
将返回Symbol
,因此是有效的列名。
答案 1 :(得分:3)
很遗憾,您无法使用数字在DataFrame中开始名称。
code that does the parsing of names确保此限制保持不变。
我认为这是因为在julia中进行解析::aa
命名一个符号,而:2aa
是一个值(考虑到1:2aa
是一个范围更有意义)
答案 2 :(得分:1)
您可以在导入后使用rename!()
:
df = csv"""
,1Y,2Y,3Y
1Y,11,12,13
2Y,21,22,23
"""
rename!(df, Dict(:x1Y =>Symbol("1Y"), :x2Y=>Symbol("2Y"), :x3Y=>Symbol("3Y") ))
2×4 DataFrames.DataFrame
│ Row │ x │ 1Y │ 2Y │ 3Y │
├─────┼──────┼────┼────┼────┤
│ 1 │ "1Y" │ 11 │ 12 │ 13 │
│ 2 │ "2Y" │ 21 │ 22 │ 23 │
您的代码稍后可能会遇到问题,最好避免使用以数字开头的列名...