如何在julia中仅选择dataframe列的子集
我有一个由几列组成的数据框架,比如第1列、第2列……第100列。如何仅选择列的子集,例如(不是列1)应返回所有列column2…column100如何在julia中仅选择dataframe列的子集,julia,Julia,我有一个由几列组成的数据框架,比如第1列、第2列……第100列。如何仅选择列的子集,例如(不是列1)应返回所有列column2…column100 data[[colnames(data) .!= "column1"]]) 似乎不起作用 我不想改变数据帧。我只想选择所有没有特定列名的列,如我的示例中所示。colnames(data)。!=“column1”#=>返回布尔值的数组 我认为正确的方法是使用一个过滤器函数,返回所需的列名 filter(x->x!=“column1”,colnames
data[[colnames(data) .!= "column1"]])
似乎不起作用
我不想改变数据帧。我只想选择所有没有特定列名的列,如我的示例中所示。colnames(data)。!=“column1”
#=>返回布尔值的数组
我认为正确的方法是使用一个过滤器函数,返回所需的列名
filter(x->x!=“column1”,colnames(data))
返回一个字符串数组
数据帧列名是符号数据类型
map(symbol,str_array_of_filterd_column_name)
#=>返回相同符号的数组正如@Reza Afzalan所说,您尝试执行的操作返回字符串数组,而数据帧中的列名是符号
鉴于Julia没有条件列表理解能力,我想你能做的最好的事情就是
data[:, filter(x -> x != :column1, names(df))]
这将为您提供删除了第1列的数据集(无需对其进行修改)。您还可以将其扩展到检查姓名列表:
data[:, filter(x -> !(x in [:column1,:column2]), names(df))]
更新:正如Ian在下面所说的,对于这个用例,Not
语法现在是最好的选择
更一般地说,条件列表理解现在也可用,因此您可以执行以下操作:
data[:, [x for x in names(data) if x != :column1]]
编辑11/3/21:鉴于人们仍在对此进行投票,我想我应该更新它,说DataFrames现在允许字符串作为列名,实际上,names()
函数现在返回字符串,所以您可以这样做
data[:, [x for x in names(data) if x != "column1"]]
但正如Ian在下面所说的,更新版本的数据帧还附带了inversedics
导出,因此您可以直接执行
data[:, Not("column1")] # or :column1
或
一种方法是使用索引选择一系列列
idx=长度(数据)
数据[2:idx]
执行条件选择的其他方法是在中按名称选择多个列:
df[[:col1, :col2]
或者,对于DataFrames库的其他版本,我使用:
select(df, [:col1, :col2])
从DataFrames 0.19开始,您现在似乎可以
select(data, Not(:column1))
选择除列之外的所有列column1
。要选择除多列以外的所有列,请在反向索引中使用数组:
select(data, Not([:column1, :column2]))
提到使用一组名称作为选择,尽管没有深入讨论定义此类集合的方法。
data[!,2:ncol(df)]
选择除第一列以外的所有列有什么问题吗?谢谢。这没什么问题,不过如果你那样做的话,我可能会把它写成data[!,2:end]
只要确保所有要删除的列都存在于数据中,否则会引发ArgumentError:column not found in the data frame
这很有效。在本例中,它返回dataframe列的副本。我认为等价物是df[:,[:col1,:col2]]
。要获取对相同数据帧列的引用(不要复制),请使用df[!,[:col1,:col2]]
select(data, Not([:column1, :column2]))