pandas Python在列中第一次出现后删除每个组的行

cuxqih21  于 2023-02-06  发布在  Python
关注(0)|答案(3)|浏览(140)

我有一个 Dataframe 如下:

df = pd.DataFrame({'Key':[1,1,1,1,2,2,2,4,4,4,5,5],
                   'Activity':['A','A','H','B','B','H','H','A','C','H','H','B'],
                   'Date':['2022-12-03','2022-12-04','2022-12-06','2022-12-08','2022-12-03','2022-12-06','2022-12-10','2022-12-03','2022-12-04','2022-12-07','2022-12-03','2022-12-13']})

我需要计算在“Activity”==“H”之前发生的每个“Key”的活动,如下所示:

所需输出

我的方法

1.按关键字和日期对df排序(样本输入已排序)
1.删除每组中“H”活动之后出现的行,如下所示:

  1. Groupby df.groupby(['关键字','活动']).count()
    是否有更好的方法,如果没有,然后帮助我在代码中删除发生在每个组中的“H”活动之后的行。
    先谢了!
fcg9iug3

fcg9iug31#

您可以将H日期"返回"到前面的每一行,以便在比较中使用。
首先在新列中标记每个H日期:

df.loc[df["Activity"] == "H" , "End"] = df["Date"]
Key Activity        Date         End
0     1        A  2022-12-03         NaT
1     1        A  2022-12-04         NaT
2     1        H  2022-12-06  2022-12-06
3     1        B  2022-12-08         NaT
4     2        B  2022-12-03         NaT
5     2        H  2022-12-06  2022-12-06
6     2        H  2022-12-10  2022-12-10
7     4        A  2022-12-03         NaT
8     4        C  2022-12-04         NaT
9     4        H  2022-12-07  2022-12-07
10    5        H  2022-12-03  2022-12-03
11    5        B  2022-12-13         NaT

向后填充每组的新列:
一个二个一个一个
然后可以选择DateEnd之前的行

df.loc[df["Date"] < df["End"]]
Key Activity        Date         End
0    1        A  2022-12-03  2022-12-06
1    1        A  2022-12-04  2022-12-06
4    2        B  2022-12-03  2022-12-06
7    4        A  2022-12-03  2022-12-07
8    4        C  2022-12-04  2022-12-07

要生成最终表单,可以使用.pivot_table()

(df.loc[df["Date"] < df["End"]]
   .pivot_table(index="Key", columns="Activity", values="Date", aggfunc="count")
   .reindex(df["Key"].unique()) # Add in keys with no match e.g. `5`
   .fillna(0)
   .astype(int))
Activity  A  B  C
Key              
1         2  0  0
2         0  1  0
4         1  0  1
5         0  0  0
hgqdbh6s

hgqdbh6s2#

试试这个:

(df.loc[df['Activity'].eq('H').groupby(df['Key']).cumsum().eq(0)]
.set_index('Key')['Activity']
.str.get_dummies()
.groupby(level=0).sum()
.reindex(df['Key'].unique(),fill_value=0)
.reset_index())

输出:

Key  A  B  C
0    1  2  0  0
1    2  0  1  0
2    4  1  0  1
3    5  0  0  0
vfh0ocws

vfh0ocws3#

您可以尝试:

# sort by Key and Date
df.sort_values(['Key', 'Date'], inplace=True)

# this is to keep Key in the result when no values are kept after the filter
df.Key = df.Key.astype('category')

# filter all rows after the 1st H for each Key and then pivot
df[~df.Activity.eq('H').groupby(df.Key).cummax()].pivot_table(
  index='Key', columns='Activity', aggfunc='size'
).reset_index()

#Activity Key  A  B  C
#0          1  2  0  0
#1          2  0  1  0
#2          4  1  0  1
#3          5  0  0  0

相关问题