我有一个小函数我正在运行pandas,当我运行if x in y
语句时抛出一个ValueError。我看到类似的问题推荐布尔索引,.isin()
和where()
,但我无法使任何示例适应我的情况。任何建议将非常感谢。
附加说明:groups
是包含数据帧外字符串的列表。我对该函数的目标是查看数据框中的项目所在的列表,然后返回该列表的索引。我在下面的笔记本链接中的第一个版本使用iterrows
循环数据帧,但我知道在大多数情况下这是次优的。
Jupyter笔记本上有一些假数据:https://github.com/amoebahlan61/sturdy-chainsaw/blob/master/Grouping%20Test_1.1.ipynb
谢谢!
码:
def groupFinder(item):
for group in groups:
if item in group:
return groups.index(group)
df['groupID2'] = groupFinder(df['item'])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-16-808ac3e51e1f> in <module>()
4 return groups.index(group)
5
----> 6 df['groupID2'] = groupFinder(df['item'])
<ipython-input-16-808ac3e51e1f> in groupFinder(item)
1 def groupFinder(item):
2 for group in groups:
----> 3 if item in group:
4 return groups.index(group)
5
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
953 raise ValueError("The truth value of a {0} is ambiguous. "
954 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 955 .format(self.__class__.__name__))
956
957 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方案我遇到了一些pandas博客文章,并从reddit用户那里得到了一些反馈,这给了我一个解决方案,通过使用pandas的iterrows
函数跳过使用apply
。
df['groupID2'] = df.item.apply(groupFinder)
谢谢大家的帮助和回复。
使用isin
的方法是先调用Series.isin(...)
生成一个布尔掩码,然后使用此掩码进行索引。或者,要在列表而不是系列中使用您的函数,您可以调用groupFinder(df['item'].values)
。
IIUC,您可以使用Pandas在几行中完成您想要的任务:
import pandas as pd
# create master list of items
master = pd.Series(legumesGroup + herbGroup + radishGroup)
# assign group id as index
master.index = [0]*len(legumesGroup) + [1]*len(herbGroup) + [2]*len(radishGroup)
# sample from master with replacement to get itemList
itemList = master.sample(n=1000, replace=True)
现在让itemList
中的每个项目都在组中,调用itemList
来查看组ID加上项目,或者只调用itemList.index
。
itemList.head()
输出:
2 Horseradish
2 Rutabaga
2 Turnip
0 Chickpeas
0 Pinto beans
解
我遇到了一些pandas博客文章,并从reddit用户那里得到了一些反馈,这给了我一个解决方案,通过使用pandas的apply函数跳过使用iterrows。
df['groupID2'] = df.item.apply(groupFinder)
谢谢大家的帮助和回复。