Skip to main content
 首页 » 编程设计

python之isin 检查列表-Pandas Dataframe

2025年05月04日9lyj

我想根据列表从数据框中选择一些数据。我提到了很多问题,包括 this一。我的“df2”如下所示:

   col1 col2  session_number col3 col4  session 
0    1.1    A               0  1.1    X        1 
1    1.1    A               1  1.7    X        2 
2    1.1    A               2  2.5    Y        3 
3    2.6    B               0  2.6    Y        7 
4    2.5    B               0  3.3    Z        5 

我想将“col2”和“session”分组到另一个数据框中。

df3 = pd.DataFrame({'count' : df2.groupby( ["col2","session"] ).size()}).reset_index() 

所以我的 df3 是这样的:

   col2  session  count 
0     A        1      1 
1     A        2      1 
2     A        3      1 
3     A        6      1 
4     B        5      1 
5     B        7      1 

现在我想找到 col2='D' 的 session 值。(这些值不在这里,因为我只放置了数据帧的一部分)

li = [] 
li.append(df3[df3.col2 == 'D' ]['session'].values) 

然后我想回到 df2 并为“li”中的 session 值获取相应的“col1”值

print df2[df2['session'].isin(li)]['col1'].unique() 

它给出以下错误。

Traceback (most recent call last): 
  File "/home/nilani/Desktop/testingSessions.py", line 40, in <module> 
    print df2[df2['session'].isin(li)]['col1'].unique() 
  File "/usr/local/lib/python2.7/dist-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/series.py", line 2785, in isin 
    value_set = set(values) 
TypeError: unhashable type: 'numpy.ndarray' 

但是如果我像下面这样在“li”中使用值,它不会给出任何错误并正确打印输出。

print df2[df2['session'].isin([ 4, 10])]['col1'].unique() 

这里有什么问题?

请您参考如下方法:

这是因为你 li 是一个包含数组的列表:

li == [array([4, 10])] 

目前,查看 isin li 试图查看是否有东西是具有 4 和 10 的数组(而不是包含在其中)...事实上,这更糟糕因为即使查看 in li 是否会产生错误。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

你想要更简单的:

li == array([4, 10]) 

也就是

li = df3[df3.col2 == 'D' ]['session'].unique()  # or values 

但是,在前面的问题中,您的 session 值是通过按 col2 分组获得的,因此这将与以下内容完全相同:

df[df['col2'] == 'D']['col1'].unique()