我有一个 CSV 看起来像这样(当带入 pandas Dataframe 时
read_csv()
,看起来是一样的)。
我想根据以下逻辑更新 ad_requests 列中的值:
对于给定的行,如果 ad_requests 有值,则保留它。否则,为其指定一个值,即上一行的 ad_requests 值减去上一行的impressions 值。所以在第一个示例中,我们希望以:
我得到了一部分:
df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
这就是我卡住的地方。在 else
之后,我想“返回”并访问上一个“行”,尽管我知道这不是 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]
警告来自于我们正在更改数据框 View 的值,这会影响原始数据框。然而,这是我们希望做的,所以我们并不关心。
(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']
关于python - 在 pandas 系列中使用前一个 "row"的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733560/