2016-12-01 3 views
2

問題の概要PANDASデータフレーム内のトリッキーstrの値の交換

私はパンダDATAFRAMEにCSVファイルからロードされた在庫データをきれいにしようとしています。私が実行する索引付け操作は機能します。私がprintに電話すると、私はフレームから引き出されている値を見ることができます。しかし、スクリーンショットに示すように値を置き換えようとすると、PANDASは私の要求を無視します。最終的に、私はちょうど1つの列から値を抽出し、別の列に移動しようとしています。 PANDASのドキュメントでは.replace()メソッドの使用を提案していますが、これは実行しようとしている操作では機能していないようです。

ここにはcode and data before and after code is runの写真があります。

と、(PICで参照されるように)forループ:

for i, j in zip(all_exchanges['MarketCap'], all_exchanges['MarketCapSym']): 
    if 'M' in i: j = j.replace('n/a','M') 
    elif 'B' in i: j = j.replace('n/a','M') 

答えて

0

投稿したすべての方に感謝します。あなたの解決策や問題をもう少し考えてみたら、別のアプローチがあるかもしれないことに気付きました。 MarketCapSym列を'n/a'で初期化する代わりに、代わりにその列をMarketCapのコピーとして作成し、「M」または「B」以外のものを抽出しました。

私は1つのラインまでの解決策を得ることができました:

all_exchanges['MarketCapSymbol'] = [ re.sub('[$.0-9]', '', i) for i in all_exchanges.loc[:,'MarketCap'] ]

次のように解決の内訳は次のとおりです。

  1. all_exchanges['MarketCapSymbol'] = - と呼ばれるデータフレームに新しい列を作成します'MarketCapSymbol。
  2. all_exchanges.loc[:,'MarketCap'] - 新しい列の値を 'MarketCap'の値に初期化します。
  3. re.sub('[$.0-9]', '', i) for i in - 私が望むのは 'M'または 'B'なので、re.sub()を各要素に適用し、[$.0-9]を抽出してM|Bのままにします。

このように、リストの理解を使用すると、私の限られたPANDASの経験で私にはもっと自然な/読めるように思えました。どう考えているか教えてください!

0

問題はjこうして不変、文字列であることです。

データを置き換えていますが、元のデータセットにはありません。

aem = all_exchanges['MarketCap'] 
aems = all_exchanges['MarketCapSym'] 

for i in range(min(len(aem),len(aems)): # like zip: shortest of both 
    if 'M' in aem[i] or 'B' in aem[i]: 
     aems[i] = aems[i].replace('n/a','M') 

は今、あなたは元のデータセットに置き換えている:

あなたはzipせずに、それをあまり上品な別の方法を、しなければならない(私はそれが両方の条件に同じことをやっところでので、あなたのテストを簡素化)。

0

両方の列が同じデータフレームall_exchangesにある場合は、その行を反復処理します。私が覚えているの構文でなければなりません

for i, row in enumerate (all_exchanges): 
    # get whatever you want from row 
    # using the index you should be able to set a value 
    all_exchanges.loc[i, 'columnname'] = xyz 

;)

0

Hereは欠損値とパンダにはかなり網羅チュートリアルです。可能であれば、反復を避けてください。fillna()

df['MarketCap'].fillna('M', inplace=True) 
df['MarketCapSym'].fillna('M', inplace=True) 
0

すでに指摘したように、元のデータは変更していません。インデックスをMarketCap列に追加し、次のように置換を実行します。

# overwrites any data in the MarketCapSym column 
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'), 
        'MarketCapSym'] = 'M' 

# only replaces 'n/a' 
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'), 
        'MarketCapSym'].replace({'n/a', 'M'}, inplace=True) 
関連する問題