熊猫:替代iterrow循环

问题描述 投票:2回答:3

我有一个小函数我正在运行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)

谢谢大家的帮助和回复。

python pandas numpy dataframe
3个回答
0
投票

使用isin的方法是先调用Series.isin(...)生成一个布尔掩码,然后使用此掩码进行索引。或者,要在列表而不是系列中使用您的函数,您可以调用groupFinder(df['item'].values)


0
投票

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

0
投票

我遇到了一些pandas博客文章,并从reddit用户那里得到了一些反馈,这给了我一个解决方案,通过使用pandas的apply函数跳过使用iterrows。

df['groupID2'] = df.item.apply(groupFinder)

谢谢大家的帮助和回复。

© www.soinside.com 2019 - 2024. All rights reserved.