5

私はこのように見えるCSVを持っています(そして、 read_csv()のパンダのDataframeに持ってきても同じように見えます)。パンダシリーズの前の「行」の値を使用

enter image description here

Iは、以下の論理に従ってカラムad_requestsの値を更新する:

所与の行について、ad_requestsの値を有する場合、単独でそれを残します。それ以外の場合は、の値を前の行の値ad_requestsから、前の行の値の表示値に設定します。だから、最初の例では、我々はで終わるしたいと思います:

enter image description here

私は部分的にそこに着く:

df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]] 

そして、私は動けなくなる場所です。 elseの後、パンダが使われる方法ではないことは分かっていますが、私は元に戻って前の行にアクセスしたいと思います。 もう1つ注意すべきことは、行は常に列であり、列はad_tag_nameで3つにグループ化されることです。もし私がpd.groupby["ad_tag_name"]なら、私はこれをlistに変えてスライスとインデックス作成を開始できますが、もう一度、これはパンダで(もっと多くのことがあるので)これを行うためのよりよい方法でなければならないと思います。

のPython:2.7.10

パンダ:0.18.0

+1

ヒント: 'df.ad_requests.ffill() - df.impressions.cumsum()。shift()'は途中で途絶えることがあります。 –

+0

興味深い。このアプローチを使用すると、最初の数行の空行では値が*わずかにオフになり、最終的には負になります。http://imgur.com/a/k7faf – Pyderman

+0

これはヒントであり、完全な解決策ではありません。 ad_requestsが0でないか、そのようなときに、cumsumを0にリセットする必要があります。 –

答えて

3

あなたはこのような何かをしたいと思う:

pd.options.mode.chained_assignment = None #suppresses "SettingWithCopyWarning" 
for index, elem in enumerate(df['ad_requests']): 
    if pd.isnull(elem): 
     df['ad_requests'][index]=df['ad_requests'][index-1]-df['impressions'][index-1] 

警告は、我々が変更しているという事実から来ています元のデータフレームに影響を及ぼすデータフレームのビューの値。それは私たちがやりたいことですが、本当に私たちを懸念するものではありません。

df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions'] 

削除しに

df['ad_requests'][index]=df['ad_requests'][index-1]-df['impressions'][index-1] 

からのコードの最後の行を変更する

(パイソン2.7.12およびパンダ0.19.0)

EDIT警告を抑制する必要性:

for index, elem in enumerate(df['ad_requests']): 
    if pd.isnull(elem): 
     df.at[index,'ad_requests']=df.at[index-1,'ad_requests']-df.at[index-1,'impressions'] 
+1

私は前の要素のインデックスを何らかの形で使う必要があることを知っていましたが、 'enumerate()'について忘れてしまっていました。そして、私は、ほとんどのパンダベースのソリューションがそうであるように、最終的な解決策が短くてきれいであることを知っていました。この優雅なアプローチをありがとう。 – Pyderman

関連する問題