2016-04-22 12 views
2

私はデータを操作するためにPandasデータフレームを使用し、通常、それらを仮想スプレッドシートとして視覚化します。行と列は個々のセルの位置を定義します。私は、データフレームをスライスしてダイスする方法には満足していますが、データフレームに1つの行が含まれている場合は、何らかの異常な動作があるようです。基本的には、特定の基準を満たす大きな親データフレームからデータの行を選択し、その結果を子データフレームとして別の関数に渡して処理する必要があります。場合によっては、親データフレームに定義された基準を満たすレコードが1つしかないため、子データフレームには単一の行しか含まれません。それにもかかわらず、親データベースと同じ方法で娘のデータにアクセスできる必要があります。1行のPandasデータフレームのデータへのアクセス

import pandas as pd 
tempDF = pd.DataFrame({'group':[1,1,1,1,2,2,2,2], 
         'string':['a','b','c','d','a','b','c','d']}) 
print(tempDF) 

次のようになります:指して説明するために、次のデータフレームを検討し、私は今、それらの行を選択することができます例として

group string 
0  1  a 
1  1  b 
2  1  c 
3  1  d 
4  2  a 
5  2  b 
6  2  c 
7  2  d 

をどこ「グループ」== 2と「文字列」= = 'c'、これはただ1つの行を生成します。予想されるように、データフレームの長さは1であり、それは、元のデータフレームのインデックス値に基づいて)(.IXを使用してちょうど1つのセルを印刷することが可能です:

tempDF2 = tempDF.loc[((tempDF['group']==2) & (tempDF['string']=='c')),['group','string']] 
print(tempDF2) 
print('Length of tempDF2 = ',tempDF2.index.size) 
print(tempDF2.loc[6,['string']]) 

出力:

group string 
6  2  c 
Length of tempDF2 = 1 
string c 

しかし、 .locを使用して単一の行を選択すると、データフレームは転置形式で出力され、データフレームの長さは2になります(1ではなく)。明らかに、それは元の親データフレームのインデックスに基づいて、単一のセル値を選択することはできなくなりました:

tempDF3 = tempDF.loc[6,['group','string']] 
print(tempDF3) 
print('Length of tempDF3 = ',tempDF3.index.size) 

は出力:私の心の中で

group  2 
string c 
Name: 7, dtype: object 
Length of tempDF3 = 2 

、両方のこれらの方法は、実際に、すなわち、同じことをやっています1行のデータを選択します。しかし、第2の例では、行と列が転置されて、予期した方法でデータを抽出することが不可能になる。

なぜこれらの2つの動作が存在する必要がありますか?デフォルトの動作として、データフレームの1行を転置するポイントは何ですか? 1つの行を含むデータフレームが他の関数に渡されたときに転置されないようにするにはどうすればよいですか? .loc選択の最初の位置に6

+0

'tempDF.loc [6:6]'はあなたの問題を解決しますか? – MaxU

+0

もう1つは実際にはndarrayを返すと思います – fernandezcuesta

+0

@MaxU - そうできる。返信いただきありがとうございます。 – user1718097

答えて

3
tempDF3 = tempDF.loc[6,['group','string']] 

は、戻り値の型がシリーズとなり問題となることを指示します。代わりに[6]を使用してください:

tempDF3 = tempDF.loc[[6],['group','string']] 
+0

だから私はリストを.loc()に渡すことが行くルールだと思います。そんなにありがとう - 私は、このような微妙な解決策を見つけるために何時間も探していた可能性があります。 – user1718097

+1

私はちょうどlocにリストを渡すことが非常に遅いことに気づいた。しかし、スライス、すなわち.loc [6:6]を渡すことは速く、必要に応じて動作します。興味深いのは –

+0

@AnatoliyOrlovです。私はそれを使いこなすつもりです。私に言ってくれてありがとう。 – piRSquared

関連する問題