根据条件从不同的列和索引获取值

时间:2019-08-21 07:31:17

标签: python python-3.x pandas pandas-groupby

给出代表用户事件的df。

index   id  action_id   feature session_id  n_page duration
1       1    null       null    1_1         1      1
2       1    3          a       1_1         2      1
3       1    null               1_1         3      1
4       1    null       pay     1_1         4      1
5       1    24                 1_1         5      1
6       1    107                1_1         6      2
7       2    null               2_1         1      1
8       2    107        c       2_1         2      1
9       2    null               2_1         3      1
10      2    34         pay     2_1         4      1

仅当在具有action_id == 34或24且n_page值通过action_id的会话中,当action id == 3或107时,我需要按session_id分组并获取功能列的最后一个值

输出df:

session_id  n_page  feature sum_duration
1_1         5       a       7
2_1         4       c       4

3 个答案:

答案 0 :(得分:1)

df_group = df[["session_id", "sum_duration"]].groupby("session_id")["sum_duration"].sum().reset_index()

df_dup = df[(df["action_id"] == 3)| (df["action_id"] == 104)]["session_id","n_page","feature"]

df_dup.merge(df_group, on = "session_id", how = "inner" )

我们可以根据所需的输出更改加入条件。 如果这不能产生所需的输出,那么如果提供用于创建输入数据的代码,那就太好了。

答案 1 :(得分:0)

通过boolean indexingSeries.isin过滤行,并通过merge合并在一起:

df1 = df.loc[df['action_id'].isin([3,107]),["session_id","feature"]]
df2 = df.loc[df['action_id'].isin([34,24]),["session_id","n_page"]]

df3 = pd.merge(df1, df2, on='session_id')
print (df3)
  session_id feature  n_page
0        1_1       a       5
1        2_1       c       4

答案 2 :(得分:0)

尝试以下方法。希望这会有所帮助。

如果数据集很大,请首先执行分组。

grouped_df = data_df.groupby('id')

现在从grouped_df的对象中逐个获取分组的df

grouped_df.get_group(1)[ (grouped_df.get_group(1)['action_id'] == 3) | (grouped_df.get_group(1)['action_id'] == 107)  ]

您可以使用所需的键值代替get_group函数中的1来获取所需的组。