如何将pandas列拆分为多个列
如何将pandas列拆分为多个列
我从一个CSV文件中加载一些机器学习数据。前两列是观测值,其余列是特征。
目前,我做了以下操作:
data = pandas.read_csv('mydata.csv')
这会得到类似于:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
我想把这个数据框切分成两个数据框:一个包含列a
和b
,另一个包含列c
、d
和e
。
不可能这样写:
observations = data[:'c'] features = data['c':]
我不确定最好的方法是什么。我需要一个pd.Panel
吗?
顺便说一下,我觉得数据框索引非常不一致:data['a']
是允许的,但data[0]
不允许。另一方面,data['a':]
不允许,但data[0:]
是允许的。
这是有实际原因的吗?如果列是按整数索引的,这真的很令人困惑,因为data[0] != data[0:1]
。
在使用Pandas进行数据处理的过程中,有时候我们需要将一个列拆分成多个列。上述内容中提到了使用.ix方法来实现这个目的,但是这个方法在Pandas v0.20版本之后已经被弃用,应该使用.loc或者.iloc方法来代替。
在上述内容中,给出了一个例子来说明如何使用.ix方法来拆分列。首先创建一个DataFrame对象df,然后使用.ix方法来选择列'b'到最后一列,并将结果保存在新的DataFrame对象中。代码如下:
df = DataFrame(np.random.rand(4,5), columns = list('abcde')) df.ix[:,'b':]
输出结果为:
b c d e 0 0.418762 0.042369 0.869203 0.972314 1 0.991058 0.510228 0.594784 0.534366 2 0.407472 0.259811 0.396664 0.894202 3 0.726168 0.139531 0.324932 0.906575
在这个例子中,.ix[row slice, column slice]表示选择指定的行和列。更多关于Pandas索引的信息可以参考http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced。
需要注意的是,Pandas中的范围包括起始点和结束点。例如,代码`data.ix[:, 'a':'c']`会选择包括列'a'、'b'和'c'的所有列。
另外,可以通过传递多个列的索引来选择多个列,例如`df.ix[:,[0,3,4]]`。
上述内容中还提到了使用.loc方法代替.ix方法的好处,可以参考stackoverflow.com/a/31593712/4323。
需要注意的是,.ix方法已经被弃用,不应该再使用。因此,旧的回答需要被删除。
问题的原因是用户想要将一个pandas列拆分成多个列。解决方法是使用.loc进行标签索引来选择行和列,并利用切片操作将列拆分成多个列。
以下是解决问题的具体步骤:
1. 使用.loc选择所有行和从'foo'到'sat'(包括'sat')的所有列:
df.loc[:, 'foo':'sat']
2. 使用.loc选择从'foo'到'cat',每隔2个列:
df.loc[:, 'foo':'cat':2]
3. 使用.loc选择从开始到'bar'的所有列:
df.loc[:, :'bar']
4. 使用.loc选择从'quz'到末尾,每隔3个列:
df.loc[:, 'quz'::3]
5. 使用.loc选择从'sat'到'bar'的列(注意:由于切片方向错误,不会返回任何列):
df.loc[:, 'sat':'bar']
6. 使用.loc选择从'sat'到'bar'的列,并逆序返回:
df.loc[:, 'sat':'bar':-1]
7. 使用.slice函数来选择从'quz'到末尾,每隔2个列:
df.loc[:, slice('quz',None, 2)]
8. 使用.loc选择特定的列,如'foo','bar'和'dat':
df.loc[:, ['foo','bar','dat']]
9. 使用.loc选择从'w'到'y'行和从'foo'到'ant'列,每隔3个列:
df.loc['w':'y', 'foo':'ant':3]
10. 如果在apply函数中使用lambda函数,可以使用.loc来选择特定列,例如:
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
在myfunc函数中,可以使用row['foo':'ant']来访问这些列。
使用.loc函数可以方便地对pandas列进行切片和选择,通过指定起始和结束位置以及步长,可以将一列拆分成多个列。