2017-01-31 10 views
2

複数の特定の既存の列から入力を受け取る関数を適用して、データフレームに2つの新しい列を追加します。ここでPandasを使用して特定の列入力から複数の列出力を返す関数を使用

は、複数の列を返すために働く私のアプローチではなく、:ここで

は私DATAFRAMEです:

d = {'a': [3,0,2,2], 
    'b': [0,1,2,3], 
    'c': [1,1,2,3], 
    'd': [2,2,1,3]} 

df = pd.DataFrame(d) 

私はこの機能を適用しようとしています:

def myfunc(a,b,c): 
    if a > 2 and b > 2: 
     print('condition 1',a,b) 
     return pd.Series((a,b)) 
    elif a < 2 and c < 2: 
     print('condition 2',a,c) 
     return pd.Series((b,c)) 
    else: 
     print('no condition') 
     return pd.Series((None,None)) 

このように:

df['e'],df['f'] = df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1) 

出力:

no condition 
no condition 
condition 2 0 1 
no condition 
no condition 

DATAFRAME結果:

enter image description here

どうすれば入力複数の列と複数の列を取得しますか?

答えて

2

問題は、割り当てではないmyfunc

あなたはタプルとしてデータフレームを解凍しようとすると、それが列lablesを返しています。あなたはすべてのために(1 0)を取得する理由です

df['e'], df['f'] = pd.DataFrame([[8, 9]] * 1000000, columns=['Told', 'You']) 
print(df) 

    a b c d  e f 
0 3 0 1 2 Told You 
1 0 1 1 2 Told You 
2 2 2 2 1 Told You 
3 2 3 3 3 Told You 

使用join

df.join(df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1)) 

それともpd.concat

pd.concat([df, df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1)], axis=1) 

両方与える

a b c d e f 
0 3 0 1 2 NaN NaN 
1 0 1 1 2 1.0 1.0 
2 2 2 2 1 NaN NaN 
3 2 3 3 3 NaN NaN 
+0

興味深いことに、私は最初にそれについて考えましたが、テストしたところ、自然とNAの列が2つありました(そして、私はパンダのもう1つの魔法を考えました) – Boud

+0

これは私に奇妙な出力を与えています。条件の1つが真の場合、新しい列のすべての値に「なし」ではなくその出力が設定されます。 – sparrow

+0

@sparrow実際に使用しているデータで更新する必要がありますが、これは私にとってはうまくいくようです。また、私はそこに 'None'を持っていることに注意してください。しかし、 'pandas'は' NaN'にするでしょう – piRSquared

2

NAsのいずれかのシリーズまたはmy_functが一致したときに2タプルの関数が返されます。それを修正するために

一つの方法は、自動的に適用することによって拡張されることを、代わりにシリーズを返すことです:

def myfunc(col1,col2,col3): 
    if col1 == 'x' and col2 == 'y': 
     return pd.Series((col1,col2)) 
    if col2 == 'a' and col3 == 'b': 
     return pd.Series(('yes','no')) 

注二重括弧はタプルとして一つの引数を渡します。リストもうまくいくはずです。

+0

おかげBoud、私は返しますシリーズやリストとして私はまだsaを得る私は値のエラー。 – sparrow

+0

あなたは何か間違っている、またはあなたの質問であなたが記述した問題と実際の現実ではない、別の問題がある – Boud

+1

Boud、私は私の質問をより明確に編集しました。私が間違っていることが分かったら、教えてください。 – sparrow

関連する問題