2016-10-21 10 views
1

問題「列名に行の値と一致し、パンダのその交差する値を取る方法」


Pythonの:パンダ:マッチ行の値列名/キーの値に

コンテキスト

df = pd.DataFrame([{'name': 'john', 'john': 1, 'mac': 10}, {'name': 'mac', 'john': 2, 'mac': 20}], columns=["name", "john", "mac"]) 

このように見ると:: 私たちは、このようなパンダのDFが持っている

すなわち
name | john | mac 
john | 1 | 10 
mac | 2 | 20 


所望の出力

name | john | mac | value 
john | 1 | 10 | 1 
mac | 2 | 20 | 20 

、カラム"value"名前が交差する対応する列の数を取るべきです。

ので、name == 'john'場合、その列の値を取る「ジョン
ので、name == 'mac'場合、その列の値を取る「MAC」

これまでにしようとしました
ラムダのバンチ(成功しなかった)。

仕様
のPython:3.5.2
パンダ:0.18.1

+0

データフレームの定義がテーブルにありません(異なる値) –

+0

申し訳ありませんが、私の悪いです。正しい数字で固定されたポスト。 – John

答えて

2

がうまく芋ラムダが移動するための方法ですが、あなたが作ることができ、それは、このような非常に短いあります

df = pd.DataFrame([{'name': 'john', 'john': 5, 'mac': 10}, {'name': 'mac', 'john': 10, 'mac': 15}], columns=["name", "john", "mac"]) 
df = df.set_index('name') 
df 
Out[64]: 
     john mac 
name   
john  5 10 
mac  10 15 

df['values'] = df.apply(lambda x: x[x.name], axis=1) 
In[68]: df 
Out[68]: 
     john mac values 
name     
john  5 10  5 
mac  10 15  15 

私は念入りに名前を付けるためにインデックスを設定しましたが、それがなければそれを行うことができます:

df = pd.DataFrame([{'name': 'john', 'john': 5, 'mac': 10}, {'name': 'mac', 'john': 10, 'mac': 15}], columns=["name", "john", "mac"]) 
df['values'] = df.apply(lambda x: x[x['name']], axis=1) 
df 
Out[71]: 
    name john mac values 
0 john  5 10  5 
1 mac 10 15  15 
+0

Omg、これは私のものよりもきれいです!ただ何かを学んだ。 –

+0

あなたの2番目の例は私にとって最もエレガントなように見え、そのトリックを行いました。ありがとう! – John

+0

うれしかったです! –

2

あなたは使用する行と列のラベルを受け入れる、DataFrame.lookupを使用することができます。これは(自明reset_indexを追加することで回避することができる)の重複行ラベルに問題があるということ

In [66]: df 
Out[66]: 
    name john mac 
0 john  1 10 
1 mac  2 20 

In [67]: df["value"] = df.lookup(df.index, df.name) 

In [68]: df 
Out[68]: 
    name john mac value 
0 john  1 10  1 
1 mac  2 20  20 

注意を。 applyを呼び出すよりも速くなければなりませんが、これはかなり遅くなる可能性がありますが、フレームが大きすぎない場合は十分にうまくいくはずです。

+0

ああ。私はいつもより短い方法を推測する。良いもの、私の答えよりもきれいです。 –

+0

以前は 'lookup'を使用したことがありませんでした。これは大丈夫です –

+0

大きなデータセット(2mln行)の速度差はありますか?ラムダの高速化またはルックアップ – John

関連する問題