2016-11-08 3 views
0

特定の基準に基づいて複数の方程式を必要とするデータフレームがあります。私は識別子の最初の3文字を取る必要があり、それが真であれば、その行に関連付けられた値を一定の量で除算する必要があります。特定の基準に基づいて複数の方程式をパンダ列に適用する必要があります

ID  Value 
US123 10000 
US121 10000 
MX122 10000 
MX125 10000 
BR123 10000 
BR127 10000 

私はIDが「MX」で始まる場合、100で値を分割し、IDが「BR」で始まる場合は1000の値を分割する必要があります。次のように

データフレームです。その他の値はすべて同じにする必要があります。
また、フィルタリングされた新しいデータフレームを作成したくありません。 IDでフィルタリングして論理チェックを成功させましたが、もっと大きなフレームに適用する必要があります。

これは、フィルタリングされたフレームに使用しているコードです。

filtered['Value'] = np.where(filtered.ID.apply(lambda x: x[:3]).isin(['MX']) == True, filtered.Value/100, filtered.Value/1000) 

は私もdf.locを試みたが、私はデータフレームに変更を適用する方法を見つけ出すことができない、それだけで私の一連のデータを示すが、DFにそれを適用していないようです。

このコードはここにある:

df.loc[(df['ID'].str.contains("MX") == True), 'Value']/100 
df.loc[(df['ID'].str.contains("BR") == True), 'Value']/1000 

これを行うには、任意のより良い方法はありますか? df.locを使用して変更をシリーズに表示するのではなく、メインのデータフレームにどのように適用できますか?

所望の出力は次のようになります。

ID  Value 
US123 10000 
US121 10000 
MX122 100 
MX125 100 
BR123 10 
BR127 10 

ありがとう!

答えて

1

.locを使用して除算値を計算した後で、操作が単独で配置されていないため、選択に使用するDFに再割り当てする必要があります。

str.startswithを使用して、指定されたパターンで始まる文字列を確認します。

df.loc[df['ID'].str.startswith('MX'), 'Value'] /= 100 
df.loc[df['ID'].str.startswith('BR'), 'Value'] /= 1000 
df['Value'] = df['Value'].astype(int) 
df 

enter image description here

+1

これは面白いおかげで非常に多く、作品!/=の部分は、なぜ分割記号が=記号の前にあるのかという点で混乱している。 – staten12

+1

C _increment_/_decrement_(++/- )演算子と似ていますが、値を増減する代わりにPythonがインクリメント/デクリメントされた値を変数に再割り当てします。例: - 'var + = 1'は、より冗長な' var = var + 1'を書くためのより冗長な形式です。除算/乗算も同じです。 –

関連する問題