2013-03-29 42 views
6

我有這個數據幀中的大熊貓:從pandas中獲取字符串Series和DataFrames在python中?

d=pandas.DataFrame([{"a": 1, "b": 1}, {"c": 2, "b": 4}]) 
d["name"] = ["Hello", "World"] 

我要選擇基於在「名稱」列其字符串值的元素,然後得到的值作爲一個字符串。要選擇元素:

d[d["name"] == "World"]["name"] 
Out: 
1 World 
Name: name 

問題是它沒有給出一個簡單的字符串,而是一個系列。投射到一個字符串將無濟於事 - 我怎麼才能得到這個字符串"World"?這是唯一的方法嗎?

d[d["name"] == "World"]["name"].values[0] 

謝謝。

+2

你可以擴展你的例子嗎?現在看來,你似乎把「世界」放在了一邊,並且希望得到「世界」作爲輸出。 – DSM

+0

@DSM:是的,這是正確的,但想象一下,不是採取「名稱」,我們採取了不同的col名稱,如:'d [d [「name」] ==「World」] [「other_name」]' other_name'是一個字符串列 – user248237dfsf

+2

這將是一個更好的例子。 :^)但是在一般情況下,不能保證只有一個匹配值,對嗎?所以我懷疑結果會基本上像數組一樣。你可以縮短語法 - 例如使用'max',或'iget' - 但除此之外我不確定。也許海登會有聰明的東西.. – DSM

回答

7

正如@DSM指出的那樣,通常可能會有很多行的名稱爲'World',因此我們需要選擇一行。要做到這一點

的一種方式,這似乎挺有意思可能是使用where(然後max):

In [11]: d.name.where(d.name == 'World', np.nan) 
Out[11]: 
0  NaN 
1 World 
Name: name, dtype: object 

In [12]: d.name.where(d.name == 'World', np.nan).max() 
Out[12]: 'World' 

注:如果沒有列名爲「世界」這將返回NaN的。

+0

我以前想過如果也許應該有 - 或者也許有,我只是不知道語法! - 一個類似字典的過濾方法,因此類似'd.ff({「name」:「World」})[「c」]'會給出匹配序列,而不需要複製「.name」或「d」。 – DSM

+0

@DSM我不*認爲*有(只是看看,會看起來更多),但我同意這將是一個不錯的方法,也許應該在列上採用布爾函數...我想我將添加一個。 :) –

7

有一種方法,沒有人提到可能值得注意。這是我在做多個標準檢查並獲取單個項目系列(基本上是一個唯一的行結果)時遇到的問題。第一個(也是唯一一個)項目

d[d["name"] == "World"].tolist()[0] 

在一個單一的項目:如果你在一個系列中的單個項目,只是需要一個項目或知道你要收集特定項目的指標,只是這樣做系列。

或者這樣:

d[d["name"] == "World"].tolist()[index] 

其中index是你正在尋找的系列項目的索引。

如果你想要它作爲一個字符串,你可能必須作爲一個字符串,如果它沒有默認字符串化。

相關問題