5

私はこのようなCSVを持っています(そして、でpandas Dataframeに持ち込まれると read_csv()、同じように見えます)。

ここに画像の説明を入力

次のロジックに従って、列ad_requestsの値を更新します。

特定の行について、ad_requestsに値がある場合はそのままにしておきます。それ以外の場合は、前の行のad_requestsの値から前の行のインプレッションの値を引いた値を指定します。したがって、最初の例では、最終的に次のようになります。

ここに画像の説明を入力

私は部分的にそこに着きます:

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

そして、これは私が立ち往生するところです。の後、else「戻って」前の「行」にアクセスしたいのですが、これはパンダの使用方法ではないことはわかっています。行は常に、列ad_tag_nameによって 3 つにグループ化されることに注意してください。Ipd.groupby["ad_tag_name"]の場合、これを に変換してlistスライスとインデックス作成を開始できますが、パンダでこれを行うにはもっと良い方法があるはずだと思います (多くのことがあるからです)。

パイソン: 2.7.10

パンダ: 0.18.0

4

1 に答える 1

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]

警告は、元のデータフレームに影響を与えるデータフレームのビューの値を変更しているという事実から来ています。ただし、それは私たちがやりたいことなので、実際には関係ありません。

(Python 2.7.12 およびパンダ 0.19.0)

編集:

コードの最後の行を

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']

警告を抑制する必要がなくなります。

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']
于 2016-11-22T10:44:04.943 に答える