在 pandas 系列中使用前一个 "row" 的值
Using the values of a previous "row" in a pandas series
我有一个看起来像这样的 CSV(当带入 pandas Dataframe 时
read_csv()
,看起来一样)。
我想根据以下逻辑更新 ad_requests 列中的值:
对于给定的行,如果 ad_requests 有值,则保留它。否则,给它一个值 前一行的 ad_requests 的值减去前一行的 impressions[ 的值=47=]。所以在第一个例子中,我们希望以:
我得到了一部分:
df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
这就是我卡住的地方。在 else
之后,我想 "go back" 并访问之前的 "row",尽管我知道这不是 pandas 的用途。
另一件需要注意的事情是,行将始终按列 ad_tag_name 分成三组。如果我 pd.groupby["ad_tag_name"]
,然后我可以将它变成 list
并开始切片和索引,但是我认为在 pandas 中必须有更好的方法来做到这一点(因为有很多东西)。
Python: 2.7.10
Pandas: 0.18.0
你会想做这样的事情:
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 和 Pandas 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']
我有一个看起来像这样的 CSV(当带入 pandas Dataframe 时
read_csv()
,看起来一样)。
我想根据以下逻辑更新 ad_requests 列中的值:
对于给定的行,如果 ad_requests 有值,则保留它。否则,给它一个值 前一行的 ad_requests 的值减去前一行的 impressions[ 的值=47=]。所以在第一个例子中,我们希望以:
我得到了一部分:
df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
这就是我卡住的地方。在 else
之后,我想 "go back" 并访问之前的 "row",尽管我知道这不是 pandas 的用途。
另一件需要注意的事情是,行将始终按列 ad_tag_name 分成三组。如果我 pd.groupby["ad_tag_name"]
,然后我可以将它变成 list
并开始切片和索引,但是我认为在 pandas 中必须有更好的方法来做到这一点(因为有很多东西)。
Python: 2.7.10
Pandas: 0.18.0
你会想做这样的事情:
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 和 Pandas 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']