Python 熊猫:iterrow循环的替代方案
我在pandas中运行了一个小函数,当我运行Python 熊猫:iterrow循环的替代方案,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我在pandas中运行了一个小函数,当我运行if x in y语句时,它会抛出一个ValueError。我看到了类似的问题,建议使用布尔索引,.isin()和where(),但我无法根据我的情况调整任何示例。如有任何建议,将不胜感激 附加说明:groups是包含数据帧外字符串的列表列表。我使用该函数的目标是查看数据框中的项目位于哪个列表中,然后返回该列表的索引。我在下面的笔记本链接中的第一个版本使用iterrows循环数据帧,但我知道在大多数情况下这是次优的 Jupyter笔记本上有一些虚假数据
if x in y
语句时,它会抛出一个ValueError。我看到了类似的问题,建议使用布尔索引,.isin()
和where()
,但我无法根据我的情况调整任何示例。如有任何建议,将不胜感激
附加说明:groups
是包含数据帧外字符串的列表列表。我使用该函数的目标是查看数据框中的项目位于哪个列表中,然后返回该列表的索引。我在下面的笔记本链接中的第一个版本使用iterrows
循环数据帧,但我知道在大多数情况下这是次优的
Jupyter笔记本上有一些虚假数据:
谢谢大家!
代码:
谢谢大家的帮助和回复。使用
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函数跳过使用ItErrors
df['groupID2'] = df.item.apply(groupFinder)
df['groupID2'] = df.item.apply(groupFinder)
感谢大家的帮助和回复。一般来说,在问题中加入数据链接不是一个好主意-链接可能会消失,一方面,另一方面,这会使帮助您变得更加困难。在这种情况下,单击链接也不会进入笔记本(尽管将URL字符串复制到浏览器中是可行的)。为了让其他人可以使用你的问题作为参考,考虑把你的示例数据和设置移动到你的文章的文本中。我一定会继续使用它。这是一个非常有趣的解决方案。我不会考虑向组项添加索引值。谢谢
df['groupID2'] = df.item.apply(groupFinder)