2013-03-29 11 views
6

私はパンダで、このデータフレームを持っている:Pythonでpandas SeriesとDataFramesから文字列を取得していますか?

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:はい、それは正しいですが、 "name"を取る代わりに、次のような別のcol名をとったとします: '[d [" name "] ==" World "] [" other_name "]' other_name'は文字列です – user248237dfsf

+2

これは良い例でした。 :^)しかし、一般的なケースでは、一致する値が1つしかないという保証はありません。だから私は結果が基本的に配列のようになるだろうと思う。構文を短縮するには、例えば '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私は思っていません。(ちょっと見ただけで、もう少し見ていきますが)それはかなり良い方法でしょう、多分列のブール関数を取るべきです...私は1つ追加されます。 :) –

7

誰も言及していない1つの方法があります。これは、複数の基準チェックを行っていて、単一のアイテムシリーズ(基本的にユニークな行結果)を取得していたときの問題でした。あなたはシリーズの中の1アイテムを持っているだけで、その項目を必要とするか、またはあなたが収集する特定の項目のインデックスを知っている場合は、ちょうどこの操作を行います。

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

を最初の(そして唯一の)項目のための単一の項目にシリーズ。

またはこの:

indexあなたはシリーズで探しているアイテムのインデックスです
d[d["name"] == "World"].tolist()[index] 

文字列として使用する場合は、既定で文字列化されていない場合は文字列としてキャストする必要があります。

関連する問題