【发布时间】:2021-02-04 15:08:45
【问题描述】:
我有一个名为 df 的数据框,在 Pandas 中看起来像这样:
**id amt date seq**
SB 450,000,000 2020-05-11 1
OM 430,000,000 2020-05-11 1
SB 450,000,000 2020-05-12 1
OM 450,000,000 2020-05-12 1
OM 130,000,000 2020-05-12 2
我需要在 amt 中找到每天每个 ID 的值。问题是,有时会有多个周期,如“seq”所示。
如果任何一天有 2 个周期(又名 seq=2),我需要在 seq=2 时取该 id 当天的值,并删除同一天和 id 的 seq=1 的任何值.有些日子,任何一个 id 都只有 1 个周期,在那些日子里,我可以坚持使用 seq=1 的值。
我的目标是 Pandas groupby day 然后再 groupby id,然后应用 if 语句判断 seq 列是否包含该 id 和那一天的 2,然后过滤该 groupby 对象以仅包含 seq=2 的行那天和身份证。最终结果将是一个数据框,其中仅包含 seq=2 的行(当有多个周期和seq=1 或 2)和 seq=1 的行(对于只有一个周期和 seq 的天) =1 对于所有 ID。
到目前为止我已经尝试过:
`for day in df.groupby(df['date']):
for id in day[1].groupby(['id']):
if 2 in id[1]['seq']:
id[1]=id[1].apply(lambda g: g[g['seq']==2])`
这给了我: KeyError:'seq'
我也试过了:
`for day in df.groupby(df['date']):
for id in day[1].groupby(['id']):
id=list(id)
if 2 in id[1]['seq']:
id[1]=id[1][id[1]['seq']==2]`
运行良好,但实际上并没有改变或对 df 做任何事情(保留相同数量的行)。
谁能帮我解决这个问题?
提前谢谢你!
【问题讨论】:
标签: pandas dataframe filter pandas-groupby