Python 错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。无法更新数据帧列
我有一个数据帧df,它具有以下值:Python 错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。无法更新数据帧列,python,dataframe,Python,Dataframe,我有一个数据帧df,它具有以下值: activityType activity_preferance userID agashi1996 joinClub Nan agashi1998 post Nan agashi1998 post Nan agashi1998 post Nan agashi1994 followuser Nan userID列是此处的索引 如果activityType分别为joi
activityType activity_preferance
userID
agashi1996 joinClub Nan
agashi1998 post Nan
agashi1998 post Nan
agashi1998 post Nan
agashi1994 followuser Nan
userID列是此处的索引
如果activityType分别为joinClub、post、followuser,我想用1、2和3填充activity_Preference列
我写了这段代码:
for i,row in df_activity_filter.iterrows():
if (df_activity_filter.loc[i,'activityType'] == 'joinClub'):
df_activity_filter.loc[i,'activity_preferance'] = 1
elif (df_activity_filter.loc[i,'activityType'] == 'post'):
df_activity_filter.loc[i,'activity_preferance'] = 2
elif (df_activity_filter.loc[i,'activityType'] == 'followuser'):
df_activity_filter.loc[i,'activity_preferance'] = 3
我得到一个错误:
ValueError:序列的真值不明确。使用a.empty、a.bool、a.item、a.any或a.all
所需的数据帧/输出应如下所示:
activityType activity_preferance
userID
agashi1996 joinClub 1
agashi1998 post 2
agashi1998 post 2
agashi1998 post 2
agashi1994 followuser 3
>>> print(ser)
0 True
1 False
2 True
3 True
4 False
...
有什么帮助吗?循环非常慢。您应在此处使用:
与其他解决方案的性能比较:
我的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@Djib2011的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@JenilDave的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@yashjain的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
循环真的很慢。您应在此处使用:
与其他解决方案的性能比较:
我的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@Djib2011的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@JenilDave的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@yashjain的解决方案:
In [1582]: %timeit np.select(conditions, choices)
45.5 µs ± 1.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [1584]: %timeit df['activityType'].map(mapping)
401 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1590]: %timeit df.activityType.replace({'joinClub':1,'post':2,'followuser':3})
490 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [1585]: %timeit df['activityType'].apply(lambda x: 1 if x=='joinClub' else None)
114 µs ± 1.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Mayank提供了一个很好的答案,你仍然可以探索这个方法
Mayank提供了一个很好的答案,你仍然可以探索这个方法 th;dr我想你真正想要的是把activityType的值映射成整数。这最好由政府来做 映射={'joinClub':1,'post':2,'followuser':3} df['activity\u Preference']=df['activityType'].映射 错误的意思是,如果您有这样的序列ser:
activityType activity_preferance
userID
agashi1996 joinClub 1
agashi1998 post 2
agashi1998 post 2
agashi1998 post 2
agashi1994 followuser 3
>>> print(ser)
0 True
1 False
2 True
3 True
4 False
...
其真值可能不明确,即它是真的还是假的?。如果我要写,python应该做什么:
如果ser:
做点什么
没有明确的答案,因为ser的布尔值是不明确的,因此会产生错误。th;dr我想你真正想要的是把activityType的值映射成整数。这最好由政府来做
映射={'joinClub':1,'post':2,'followuser':3}
df['activity\u Preference']=df['activityType'].映射
错误的意思是,如果您有这样的序列ser:
activityType activity_preferance
userID
agashi1996 joinClub 1
agashi1998 post 2
agashi1998 post 2
agashi1998 post 2
agashi1994 followuser 3
>>> print(ser)
0 True
1 False
2 True
3 True
4 False
...
其真值可能不明确,即它是真的还是假的?。如果我要写,python应该做什么:
如果ser:
做点什么
没有明确的答案,因为ser的布尔值是不明确的,因此会产生错误。为什么不使用 从“activityType”创建列“activity\u Preference” >>>df['activity\u Preference']=df['activityType']。复制 然后,我们将用您的条件替换“活动\首选项”列的值 >>>df['activity\u preference']。替换{'joinClub':1,'post':2,'followuser':3},inplace=True
注意:小心使用inplace=True为什么不使用 从“activityType”创建列“activity\u Preference” >>>df['activity\u Preference']=df['activityType']。复制 然后,我们将用您的条件替换“活动\首选项”列的值 >>>df['activity\u preference']。替换{'joinClub':1,'post':2,'followuser':3},inplace=True
注意:注意inplace=True请检查我的解决方案与我帖子中所有其他解决方案的性能计时。我的速度至少快了5-10倍。请检查我的解决方案与我帖子中所有其他解决方案的性能计时。我的速度至少是np的5-10倍。与np相比,map速度非常慢。选择。请检查我的时间比较解决方案。@MayankPorwal是的,你是对的,你的速度要快得多,但是如果你不太关心性能,我更喜欢map,因为它在概念上更简单、更干净……与np.select相比,map速度真的很慢。请检查我的时间比较解决方案。@MayankPorwal是的,你是对的,你的速度更快,但是如果你不太关心性能,我更喜欢map,因为它在概念上更简单、更清晰……我已经将性能时间比较与其他答案进行了比较。请查收。如果你觉得我的答案是好的,请别忘了投票。我已经把性能计时与其他答案进行了比较。请查收。如果你觉得我的答案是好的,请不要忘记投票。毫无疑问,你的解决方案很好,但它需要大量的硬编码而不是大量的打字。但是,我想我会比任何一天的写作都有更好的表现。是的,如果没有开发时间和内存限制的话,更好的表现总是赢的。毫无疑问,你的解决方案很棒,但它需要大量的硬编码而不是大量的打字。但是,我想我会比任何一天的写作都有更好的表现。是的,如果没有开发时间和内存限制,更好的表现总是胜出的