2017-09-26 5 views
0

に基づいてデータフレーム列の一部の値を置き換える:パイソンパンダ - 以下に示すように、私は、そのインデックスに基づいてパンダ列の特定の値の最初の出現をフェッチしてい指標

first_idx = df1.loc[df1.Column1.isin(['word1','word2'])].index.tolist()[0] 

これは与えます私下図のように「単語1」または「WORD2」

のいずれかが最初に出現する位置のインデックスは、それから私は、新しい値で決定したインデックスまで、レコードの古い値を置き換えています:

df1.head(first_idx)['Column1'].replace({'10': '5'}, inplace=True) 

これは、 '5'でデータフレームのfirst_idxまで存在するすべての '10'を置き換えます。 first_idx値の後に残っている '10'はすべて置き換えられません。

ここで、first_idx値の後ろにある '10'のすべてを '3'に置き換える必要があります。私はデータフレームの長さを計算し、first_idx値でそれを減算することによって以下を試しました。

len(df1)       # This will show the actual length/total number of records of a dataframe column. 
temp = (len(df1)-first_idx)-1 # This will determine the remaining count of records barring the count of records until first_idx value. 
df1.tail(temp)     # This will show all records that are present after the first_idx value. 
df1.tail(temp)['Column1'].replace({'10': '3'}, inplace=True) 

しかし、これを達成するための他のより優れた効率的な簡単な方法がありますか?

答えて

1

あなたは私はあなたのインデックスが数値であると仮定し

df1.head(first_idx) 

を使用方法から。したがって、簡単です

df1.iloc[first_idx + 1:, :]['Column1'].replace({'10': '3'}, inplace=True) 

する必要があります。

+0

ありがとうございます@エラン。できます。私はdf1.locで同じことを試みました。それはまた同じ仕事をします。可能であれば、両者の違いが何であるかを説明してください。両方とも同じ結果が得られます – JKC

+0

確かに@JKC。実際の行番号にはilocが使用されます。 df1.iloc [2:4]は、インデックスに関係なく2行目と3行目をスライスします。あなたのデータフレームのインデックスを使用してLocスライスを作成します。数字は数字でも非数字でもかまいません。あなたの指数が(あなたの場合のように)注文番号である場合、両方がまったく同じように動作します。両方を組み合わせたdf.idx []についても読んでください。私はそれをあまり使っていないが、私はlocとilocのより明示的な方法を好む。 – Eran

関連する問題