基本的な例でこれらのベクトル化方法をいつ使用するか教えてもらえますか?
私は見map
ているSeries
残りの部分であるのに対し、法DataFrame
方法。apply
とapplymap
方法について混乱しました。関数をDataFrameに適用する方法が2つあるのはなぜですか?繰り返しになりますが、使用法を説明する簡単な例はすばらしいでしょう。
基本的な例でこれらのベクトル化方法をいつ使用するか教えてもらえますか?
私は見map
ているSeries
残りの部分であるのに対し、法DataFrame
方法。apply
とapplymap
方法について混乱しました。関数をDataFrameに適用する方法が2つあるのはなぜですか?繰り返しになりますが、使用法を説明する簡単な例はすばらしいでしょう。
回答:
Wes McKinneyによるPython for Data Analysisの本、pg。132(私はこの本を強くお勧めします):
もう1つのよくある操作は、1D配列の関数を各列または行に適用することです。DataFrameのapplyメソッドはまさにこれを行います:
In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [117]: frame
Out[117]:
b d e
Utah -0.029638 1.081563 1.280300
Ohio 0.647747 0.831136 -1.549481
Texas 0.513416 -0.884417 0.195343
Oregon -0.485454 -0.477388 -0.309548
In [118]: f = lambda x: x.max() - x.min()
In [119]: frame.apply(f)
Out[119]:
b 1.133201
d 1.965980
e 2.829781
dtype: float64
最も一般的な配列統計の多く(合計や平均など)はDataFrameメソッドであるため、applyを使用する必要はありません。
要素ごとのPython関数も使用できます。フレーム内の各浮動小数点値からフォーマットされた文字列を計算したいとします。あなたはapplymapでこれを行うことができます:
In [120]: format = lambda x: '%.2f' % x
In [121]: frame.applymap(format)
Out[121]:
b d e
Utah -0.03 1.08 1.28
Ohio 0.65 0.83 -1.55
Texas 0.51 -0.88 0.20
Oregon -0.49 -0.48 -0.31
applymapという名前の理由は、Seriesには要素ごとの関数を適用するためのマップメソッドがあるためです。
In [122]: frame['e'].map(format)
Out[122]:
Utah 1.28
Ohio -1.55
Texas 0.20
Oregon -0.31
Name: e, dtype: object
まとめるapply
と、DataFrameの行/列ベースでapplymap
機能し、DataFrameでmap
要素ごとに機能し、Seriesで要素ごとに機能します。
func
にlambda x: [func(y) for y in x]
、そして列方向を適用)
map
とapplymap
作業要素単位の両方、私は一つの方法(いずれかを期待するmap
か、applymap
シリーズおよびデータフレームの両方に働くだろう)。おそらく他にも設計上の考慮事項があり、ウェスマッキーニーは2つの異なる方法を考え出すことにしました。
applymap
一緒に行う方法はありgroupby
ますか?
map
、applymap
および:コンテキストが重要ap
ply
最初の大きな違い:DEFINITION
map
シリーズのみで定義applymap
DataFramesでのみ定義されていますapply
両方に定義されています2番目の大きな違い:入力引数
map
dict
s Series
、、または呼び出し可能を受け入れますapplymap
apply
呼び出し可能オブジェクトのみを受け入れる第三の主な違い:BEHAVIOR
map
シリーズの要素ごとapplymap
データフレームの要素ごとですapply
要素ごとにも機能しますが、より複雑な操作と集計に適しています。動作と戻り値は関数によって異なります。4番目の大きな違い(最も重要な違い):ユースケース
map
あるドメインから別のドメインに値をマッピングするためのものなので、パフォーマンスが最適化されます( df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
複数の行/列にわたる要素ごとの変換に適しています(たとえば、 df[['A', 'B', 'C']].applymap(str.strip)
)apply
(例えば、ベクトル化することはできません任意の関数を適用するためのものですdf['sentences'].apply(nltk.sent_tokenize)
)脚注
map
辞書/シリーズが渡されると、その辞書/シリーズのキーに基づいて要素がマップされます。欠損値はNaNとして出力に記録されます。
applymap
最近のバージョンでは、一部の操作用に最適化されています。場合によってapplymap
はapply
、わずかに速くなります。私の提案は、両方をテストし、より適切に機能するものを使用することです。
map
要素ごとのマッピングと変換用に最適化されています。辞書またはシリーズを含む操作により、パンダはより高速なコードパスを使用してパフォーマンスを向上させることができます。Series.apply
集計操作のスカラーを返し、それ以外の場合はSeriesを返します。同様にDataFrame.apply
。メモapply
などの特定のnumpyの関数で呼び出されたときにもfastpathsを有するmean
、sum
等
これらの回答にはすばらしい情報がありますが、どの方法が配列と要素のどちらで機能するかを明確に要約するために、独自の情報を追加しています。jeremiahbuddhaは主にこれを行いましたが、Series.applyについては言及しませんでした。コメントする担当者がいません。
DataFrame.apply
行または列全体を一度に操作します。
DataFrame.applymap
、Series.apply
とSeries.map
一度に一つの要素を操作します。
Series.apply
との機能には多くのオーバーラップがありますSeries.map
。つまり、ほとんどの場合、どちらでも機能します。ただし、若干の違いはありますが、それらのいくつかはosaの回答で説明されています。
他の回答に加えて、Series
そこにもマップと適用があります。
ApplyはDataFrameをシリーズから作成できます。ただし、マップはシリーズを別のシリーズのすべてのセルに配置するだけであり、これはおそらく望んでいることではありません。
In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0 1
1 2
2 3
dtype: int64
In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]:
0 1
0 1 1
1 2 2
2 3 3
In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]:
0 0 1
1 1
dtype: int64
1 0 2
1 2
dtype: int64
2 0 3
1 3
dtype: int64
dtype: object
また、「Webサーバーに接続する」などの副作用のある関数がある場合は、apply
わかりやすくするためだけに使用します。
series.apply(download_file_for_every_element)
Map
関数だけでなく、辞書や他のシリーズも使用できます。順列を操作したいとしましょう。
取る
1 2 3 4 5
2 1 4 5 3
この順列の二乗は
1 2 3 4 5
1 2 5 3 4
を使用して計算できmap
ます。自己申告が文書化されているかどうかは不明ですが、で機能し0.15.1
ます。
In [39]: p=pd.Series([1,0,3,4,2])
In [40]: p.map(p)
Out[40]:
0 0
1 1
2 4
3 2
4 3
dtype: int64
@jeremiahbuddhaは、applymapが要素単位で機能するのに対し、applyは行/列で機能すると述べました。しかし、要素ごとの計算に適用を使用できるようです...
frame.apply(np.sqrt)
Out[102]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
frame.applymap(np.sqrt)
Out[103]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
指摘したかったのですが、私はこれに少し苦労しました。
def f(x):
if x < 0:
x = 0
elif x > 100000:
x = 100000
return x
df.applymap(f)
df.describe()
df = df.applymap(f)
df.describe()
df = modified_df
か、inplace=True
フラグを設定した場合にのみ変更されます。また、データフレームを参照によって関数に渡し、関数がデータフレームを変更すると、データフレームも変化します
.ix
か.where
などわからない完全な説明は、あなたが再割り当てていないときに必要なときに何のためにあるのか。
私の理解:
機能の観点から:
関数に列/行内で比較する必要がある変数がある場合は、を使用します
apply
。
例:lambda x: x.max()-x.mean()
。
関数を各要素に適用する場合:
1>列/行が見つかった場合は、 apply
2>データフレーム全体に適用する場合は、 applymap
majority = lambda x : x > 17
df2['legal_drinker'] = df2['age'].apply(majority)
def times10(x):
if type(x) is int:
x *= 10
return x
df2.applymap(times10)
map
シリーズのみで定義applymap
DataFramesでのみ定義されていますapply
両方に定義されていますいくつかの例を挙げてください
In [3]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [4]: frame
Out[4]:
b d e
Utah 0.129885 -0.475957 -0.207679
Ohio -2.978331 -1.015918 0.784675
Texas -0.256689 -0.226366 2.262588
Oregon 2.605526 1.139105 -0.927518
In [5]: myformat=lambda x: f'{x:.2f}'
In [6]: frame.d.map(myformat)
Out[6]:
Utah -0.48
Ohio -1.02
Texas -0.23
Oregon 1.14
Name: d, dtype: object
In [7]: frame.d.apply(myformat)
Out[7]:
Utah -0.48
Ohio -1.02
Texas -0.23
Oregon 1.14
Name: d, dtype: object
In [8]: frame.applymap(myformat)
Out[8]:
b d e
Utah 0.13 -0.48 -0.21
Ohio -2.98 -1.02 0.78
Texas -0.26 -0.23 2.26
Oregon 2.61 1.14 -0.93
In [9]: frame.apply(lambda x: x.apply(myformat))
Out[9]:
b d e
Utah 0.13 -0.48 -0.21
Ohio -2.98 -1.02 0.78
Texas -0.26 -0.23 2.26
Oregon 2.61 1.14 -0.93
In [10]: myfunc=lambda x: x**2
In [11]: frame.applymap(myfunc)
Out[11]:
b d e
Utah 0.016870 0.226535 0.043131
Ohio 8.870453 1.032089 0.615714
Texas 0.065889 0.051242 5.119305
Oregon 6.788766 1.297560 0.860289
In [12]: frame.apply(myfunc)
Out[12]:
b d e
Utah 0.016870 0.226535 0.043131
Ohio 8.870453 1.032089 0.615714
Texas 0.065889 0.051242 5.119305
Oregon 6.788766 1.297560 0.860289
FOMO:
次の例はapply
、にapplymap
適用されていDataFrame
ます。
map
関数は、シリーズにのみ適用するものです。map
DataFrameには適用できません。
覚えておく apply
べきこと applymap
は、何でもできることですが、eXtraがありapply
ます。オプションます。
Xファクターのオプションは次のとおりaxis
とresult_type
どこresult_type
ときにのみ機能しますaxis=1
(列のため)。
df = DataFrame(1, columns=list('abc'),
index=list('1234'))
print(df)
f = lambda x: np.log(x)
print(df.applymap(f)) # apply to the whole dataframe
print(np.log(df)) # applied to the whole dataframe
print(df.applymap(np.sum)) # reducing can be applied for rows only
# apply can take different options (vs. applymap cannot)
print(df.apply(f)) # same as applymap
print(df.apply(sum, axis=1)) # reducing example
print(df.apply(np.log, axis=1)) # cannot reduce
print(df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')) # expand result
補足として、Series map
関数はPythonと混同しないでくださいmap
関数。
1つ目は値をマップするためにシリーズに適用され、2つ目はイテラブルのすべてのアイテムに適用されます。