2013-10-25 237 views
22

我们如何获得一系列特定的过滤行?从熊猫数据框中获取特定的系列行

实施例数据帧:

>>> df = pd.DataFrame({'date': [20130101, 20130101, 20130102], 'location': ['a', 'a', 'c']}) 
>>> df 
     date location 
0 20130101  a 
1 20130101  a 
2 20130102  c 

我需要选择行,其中locationc为一系列

我想:

row = df[df["location"] == "c"].head(1) # gives a dataframe 
row = df.ix[df["location"] == "c"]  # also gives a dataframe with single row 

在这两种情况下,我不能行作为系列。

回答

36

使用squeeze功能将数据帧中删除一个维度:如果所得到的数据帧是:当设置为True

df[df["location"] == "c"].squeeze() 
Out[5]: 
date  20130102 
location   c 
Name: 2, dtype: object 

DataFrame.squeeze方法作用于read_csv功能的挤压参数相同的方式一个1-len数据帧,即它只有一个维度,就像它是一个列或一行,然后该对象被压缩到较小的维度对象。在你的情况下,你从DataFrame获得一个Series对象。如果将面板挤压到DataFrame上,则适用相同的逻辑。

挤压在你的代码中是明确的,并且清楚地表明你的意图是“放下”手中的对象,因为它的尺寸可以投影到更小的尺寸。

如果数据帧有多个列或行,挤压没有效果。

+0

谢谢Boud这就像一个奇迹。 'df [df [“location”] ==“c”]。squeeze()'也可以正常工作。你能否也解释一下挤压? “挤压长度1维”意味着它将1行结果转换为系列? – Pratyush

+0

@Pratyush我更新了上面的答案。我建议你调用squeeze,因为你想从1D数据框中获得一系列,这比仅仅为了投射目的调用iloc [0]更明确。 – Boud

+1

不知道哪一个更好,但挤压pythonic :) +1解释 –

9

你可以只取第一行用整数索引(iloc()功能):

>>> df[df["location"] == "c"].iloc[0] 
date  20130102 
location   c 
Name: 2, dtype: object 
+0

感谢罗马,这工作得很好。 – Pratyush