Python 3.x 如何将数据帧列的函数应用于已创建的迭代列

Python 3.x 如何将数据帧列的函数应用于已创建的迭代列,python-3.x,pandas,Python 3.x,Pandas,我有带系统事件时间的id,我按id(单个系统)对事件时间进行了分组,并创建了一个新列,如果eventtimes.diff()大于1天,则值为1,否则为0。现在我有了这个标志,我正在尝试创建一个应用于groupby('ID')的函数,因此新列从1开始,并一直为新列中的每一行返回1,直到标志显示为1,然后新列将上升到1,并一直返回2,直到标志再次显示为1 我将把它与groupby('ID')一起应用,因为我需要新列在每个ID的1处重新开始 我已尝试以下方法: def try(x): y =

我有带系统事件时间的id,我按id(单个系统)对事件时间进行了分组,并创建了一个新列,如果eventtimes.diff()大于1天,则值为1,否则为0。现在我有了这个标志,我正在尝试创建一个应用于groupby('ID')的函数,因此新列从1开始,并一直为新列中的每一行返回1,直到标志显示为1,然后新列将上升到1,并一直返回2,直到标志再次显示为1

我将把它与groupby('ID')一起应用,因为我需要新列在每个ID的1处重新开始

我已尝试以下方法:

def try(x):
    y = 1
    if row['flag']==0:
        y = y
    else:
        y += y+1 

df['NewCol'] = df.groupby('ID')['flag'].apply(try)
我尝试了上述不同的变体,但没有效果。提前感谢您提供的任何帮助

另外,如果我把问题贴错了,请随时告诉我。也不确定我的标题是否很好。

用于过滤++什么是比loopy
应用更快的解决方案

我认为您只需要为每组计数
1
,如果没有
1
,则将
1
添加到输出:

df = pd.DataFrame({
    'ID': ['a','a','a','a','b','b','b','b','b'],
    'flag': [0,0,1,1,0,0,1,1,1]
})


df['new'] = (df[df['flag'] == 1].groupby('ID')['flag']
                                .cumcount()
                                .add(1)
                                .reindex(df.index, fill_value=1))
print (df)
  ID  flag  new
0  a     0    1
1  a     0    1
2  a     1    1
3  a     1    2
4  b     0    1
5  b     0    1
6  b     1    1
7  b     1    2
8  b     1    3
详情:

#filter by condition
print (df[df['flag'] == 1])
  ID  flag
2  a     1
3  a     1
6  b     1
7  b     1
8  b     1

#count per group
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount())
2    0
3    1
6    0
7    1
8    2
dtype: int64

#add 1 for count from 1
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1))
2    1
3    2
6    1
7    2
8    3
dtype: int64
如果需要计数
0
,并且如果未添加
0
-1

df['new'] = (df[df['flag'] == 0].groupby('ID')['flag']
                                .cumcount()
                                .add(1)
                                .reindex(df.index, fill_value=-1))
print (df)
  ID  flag  new
0  a     0    1
1  a     0    2
2  a     1   -1
3  a     1   -1
4  b     0    1
5  b     0    2
6  b     1   -1
7  b     1   -1
8  b     1   -1

另一个两步解决方案:

df['new'] = df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1)
df['new'] = df['new'].fillna(1).astype(int)
print (df)
  ID  flag  new
0  a     0    1
1  a     0    1
2  a     1    1
3  a     1    2
4  b     0    1
5  b     0    1
6  b     1    1
7  b     1    2
8  b     1    3
用于过滤++什么是比loopy
应用更快的解决方案

我认为您只需要为每组计数
1
,如果没有
1
,则将
1
添加到输出:

df = pd.DataFrame({
    'ID': ['a','a','a','a','b','b','b','b','b'],
    'flag': [0,0,1,1,0,0,1,1,1]
})


df['new'] = (df[df['flag'] == 1].groupby('ID')['flag']
                                .cumcount()
                                .add(1)
                                .reindex(df.index, fill_value=1))
print (df)
  ID  flag  new
0  a     0    1
1  a     0    1
2  a     1    1
3  a     1    2
4  b     0    1
5  b     0    1
6  b     1    1
7  b     1    2
8  b     1    3
详情:

#filter by condition
print (df[df['flag'] == 1])
  ID  flag
2  a     1
3  a     1
6  b     1
7  b     1
8  b     1

#count per group
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount())
2    0
3    1
6    0
7    1
8    2
dtype: int64

#add 1 for count from 1
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1))
2    1
3    2
6    1
7    2
8    3
dtype: int64
如果需要计数
0
,并且如果未添加
0
-1

df['new'] = (df[df['flag'] == 0].groupby('ID')['flag']
                                .cumcount()
                                .add(1)
                                .reindex(df.index, fill_value=-1))
print (df)
  ID  flag  new
0  a     0    1
1  a     0    2
2  a     1   -1
3  a     1   -1
4  b     0    1
5  b     0    2
6  b     1   -1
7  b     1   -1
8  b     1   -1

另一个两步解决方案:

df['new'] = df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1)
df['new'] = df['new'].fillna(1).astype(int)
print (df)
  ID  flag  new
0  a     0    1
1  a     0    1
2  a     1    1
3  a     1    2
4  b     0    1
5  b     0    1
6  b     1    1
7  b     1    2
8  b     1    3

无法100%确定是否理解您的问题,因此,如果添加10行数据和2组数据以更好地解释问题,则会有所帮助。无法100%确定是否理解您的问题,因此如果添加10行数据和2组数据以更好地解释问题,则会有所帮助。