Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据同一列的值设置列_Python_Pandas - Fatal编程技术网

Python 根据同一列的值设置列

Python 根据同一列的值设置列,python,pandas,Python,Pandas,我有以下数据帧: userid date 1 2010-01-03 2 2009-01-04 3 2004-02-03 1 2007-01-01 我想创建一个列,如果在另一行中有另一个日期更早的类似用户ID,则该列将输出true。i、 e userid date userid_seen 1 2010-01-03 t 2 2009-01-

我有以下数据帧:

userid       date
  1        2010-01-03
  2        2009-01-04
  3        2004-02-03
  1        2007-01-01
我想创建一个列,如果在另一行中有另一个日期更早的类似用户ID,则该列将输出true。i、 e

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
[88]中的

def func(x):
如果len(df.loc[(df['userid']=x.userid)&(df['date']!=x.date),'date'])>0:
返回(df.loc[(df['userid']==x.userid)&(df['date']!=x.date),'date']
更新

尽管上述方法有效,但正如@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
[102]中的

df['user\u id\u seen']=df.groupby('userid')['date'].transform('min')
我这样做的方法是计算每个用户ID的最早日期,然后检查该行是否有较新的日期。假设
df
是您的数据帧:

min_date = pd.DataFrame(df.groupby('userid')['date'].agg({'min_date': min}))
df = df.merge(min_date, left_on='userid', right_index=True)
df['userid_seen'] = df.date > df.min_date
df = df[['userid', 'date', 'userid_seen']]  # get rid of the 'min_date' column

这将在大型数据帧上执行得非常糟糕,因为您要为每行执行两个切片操作。一般来说,在整个数据帧上做事情比迭代更好,因为这样你就可以利用numpy的优化功能了。@MattiJohn我同意,我认为你的答案更好,这是mehmm在664098行中给出的更好的答案,10分钟后处理仍然没有完成。有什么想法吗?@goh groupby操作可能会非常慢,加上这会返回一个序列,其索引与原始数据帧对齐,我并不感到惊讶