2017-08-21 10 views
2

私は、apply関数がデータフレームの行または列で動作し、系列またはデータフレームを返すというPandas apply関数のドキュメントを読んでいます。スカラを返すような方法でコードを書くことは可能ですか?または、.pipe関数をさらにチェーン化する必要があります。私は実行するとpandasデータフレームのapply関数はスカラーを生成できますか?

df = pd.DataFrame({'one' : pd.Series(np.random.randn(3), index=['a', 'b', 'c']), 
    'two' : pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd']), 
    'three' : pd.Series(np.random.randn(3), index=['b', 'c', 'd'])}) 

def my_func1(x): 
    min_of_x = x[['one', 'two']] 
    return min_of_x['one'] 

def my_func2(x): 
    min_of_x = x[['one', 'two']] 
    return min_of_x['one'].iloc[0] 

def my_func3(x): 
    min_of_x = x[['one', 'two']] 
    return min_of_x.max() 

def my_func4(x, elem_pos=0): 
    return x.iloc[elem_pos] 

:私は、マニュアルで提供されているサンプルデータフレーム上で、以下の機能を書いてみました

df.apply(my_func1, axis=1) 

それが正常に動作してくれ期待通りシリーズを提供します。

df.apply(my_func2, axis=1) 

私はエラー「はAttributeError:(」取得:「numpy.float64」オブジェクトが「何の属性を持っていませんがしかし、私はスカラーになりシリーズ値のいくつかの計算を最初の要素を好きか、そのことについて考えたとしiloc '' '、' a 'で発生しました')」 maxを計算するmy_func3を使用する場合:

df.apply(my_func3, axis=1) 

これは、再びシリーズを返すように動作します。スカラーを返すための唯一の方法は、チェーンに.pipeを使用して別の関数であるように思わ:

df.apply(my_func1, axis=1).pipe(my_func4, 2) 

だから、僕は適用機能だけシリーズまたはデータフレームと別の値を返すためにあらゆる試みを生成するかどうかを締結することを望んでいましたこのエラーが発生します。これが事実だろうか?これは、組み込みのPandaとNumPy関数では実行できない結果について計算を実行したかったからです。

答えて

2

基本的なことは、pd.Seriesオブジェクトがであり、適用するには常にが渡されることです。渡されるのは、どの軸を呼び出すかによって異なります。例えば

axis=1この通過する。

one  ... 
three ... 
two  ... 
Name: a/b/c/d, dtype: float64 

および、axis=0この通過する。いずれの場合においても

a ... 
b ... 
c ... 
d ... 
dtype: float64 

が、これはpd.Seriesオブジェクトです。

my_func1には、次のようなシリーズをスライスします。x[['one', 'two']]もシリーズオブジェクトになります。 x['one']のような個々のアイテムを索引付けすると、floatオブジェクトが戻されますので、floatオブジェクトには.ilocという属性が関連付けられていないことは当然です。これはmy_func2AttributeErrorを投げる理由です。練習として


、このコードを実行してみてください:

In [891]: def my_func1(x): 
    ...:  print(type(x['one'])) 
    ...:  min_of_x = x[['one', 'two']] 
    ...:  return min_of_x['one'] 

In [892]: df.apply(my_func1, axis=1) 

これは与える:答えを

<class 'numpy.float64'> 
<class 'numpy.float64'> 
<class 'numpy.float64'> 
<class 'numpy.float64'> 
+0

感謝を。しかし、x ['one']は系列を返します。 my_func1では、返されるオブジェクトは、インデックス 'a'、 'b'、 'c'、 'd'を持つSeriesです。だから、私は、このシリーズのフロートをで抽出することが可能であると考えていた。iloc [0]これは私がmy_func2で拡張しようとしているものです。 –

+0

@ ShivKumarあなたはどう思いますか?私の答えを見て、編集しました。 –

+0

もう一度ありがとう。私はその機能を実行した。したがって、axis = 1を使用する場合、関数は列を使用する必要があります。それからx ['one']と言って、列を浮動小数点の集合に分解させます。それは何が起こっているのですか?したがって、applyを使用すると、軸= 0か軸= 1かによって、列または行のいずれかで使用されます。個々の列や行をさらに抽出することはできませんか? –

関連する問題