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