我有以下数据框:
userid date
1 2010-01-03
2 2009-01-04
3 2004-02-03
1 2007-01-01
我想创建一个列,如果另一行中存在另一个日期更早的类似用户 ID,则该列输出 true。即
userid date userid_seen
1 2010-01-03 t
2 2009-01-04 f
3 2004-02-03 f
1 2007-01-01 f
我该怎么做?
最佳答案
这将通过调用 apply
并传递参数 axis=1
来按行应用它来工作:
In [88]:
def func(x):
if len(df.loc[(df['userid'] == x.userid) & (df['date'] != x.date), 'date']) > 0:
return (df.loc[(df['userid'] == x.userid) & (df['date'] != x.date), 'date'] < x.date).values.max()
return False
df['user_id_seen'] = df.apply(lambda row: func(row), axis=1)
df
Out[88]:
userid date user_id_seen
0 1 2010-01-03 True
1 2 2009-01-04 False
2 3 2004-02-03 False
3 1 2007-01-01 False
更新
尽管上述方法有效,但对于大型数据帧来说,它会很慢,正如 @MattiJohn 正确指出的那样,因为这会有效地迭代每一行。
以下是与 @MattiJohn 的答案类似的更紧凑的答案:
In [102]:
df['user_id_seen'] = df.groupby('userid')['date'].transform('min') < df.date
df
Out[102]:
userid date user_id_seen
0 1 2010-01-03 True
1 2 2009-01-04 False
2 3 2004-02-03 False
3 1 2007-01-01 False
关于python - pandas 根据同一列的值设置列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24606734/