如何使用混合的标签数组和对象切片按列切割pandas数据帧?

时间:2014-01-08 16:20:28

标签: python pandas

有没有办法切片将“标签数组”与“对象切片”混合的pandas数据帧。 我在这里找不到一个例子Indexing and Selecting Data

标签列表或数组['a','b','c']

标签为'a'的切片对象:'f'

以下是我尝试做的一个示例,而不是手动列出所有内容。

import pandas as pd

data = {'Week': [201301, 201301, 201302, 201302, 201303],
'Product': ['coke', 'fanta', 'coke' ,'sprite' ,'pepsi'],
'month1': [12, 1, 3, 12, 11],'month2': [12, 1, 3, 12, 11],
'month3': [12, 1, 3, 12,        11],'month4': [12, 1, 3, 12, 11],
'month5': [12, 1, 3, 12, 11]}
df = pd.DataFrame(data)

print df

输出:

   Product    Week  month1  month2  month3  month4  month5
0    coke  201301      12      12      12      12      12
1   fanta  201301       1       1       1       1       1
2    coke  201302       3       3       3       3       3
3  sprite  201302      12      12      12      12      12
4   pepsi  201303      11      11      11      11      11


df= df.loc[:,'Product':'month1']

输出:

  Product    Week  month1
0    coke  201301      12
1   fanta  201301       1
2    coke  201302       3
3  sprite  201302      12
4   pepsi  201303      11

print df

我想输出的是:

Product    Week  month1    month4  month5
0    coke  201301      12      12      12   
1   fanta  201301       1       1       1      
2    coke  201302       3       3       3      
3  sprite  201302      12      12      12     
4   pepsi  201303      11      11      11      

我如何操纵这行代码:

     df= df.loc[:,'Product':'month1']

是这样的(但有效):

     df= df.loc[:,['Product':'month1'] and ['month4','month5']]

2 个答案:

答案 0 :(得分:2)

使用一些内部方法。基本上构造所需的索引,然后使用.loc将其选中。

In [21]: df.loc[:,pd.Index(['Product','Week']) + df.columns[df.columns.slice_indexer('month2','month4')]]
Out[21]: 
  Product    Week  month2  month3  month4
0    coke  201301      12      12      12
1   fanta  201301       1       1       1
2    coke  201302       3       3       3
3  sprite  201302      12      12      12
4   pepsi  201303      11      11      11

[5 rows x 5 columns]

答案 1 :(得分:1)

您还可以通过连接一些初步数据帧来实现这一目标:

print pd.concat([df.ix[:,"Product":"Week"], df.ix[:,("month1", "month4","month5")]],axis=1)

我认为这种方法更容易。