isin检查列表 - Pandas Dataframe

时间:2013-07-14 08:06:40

标签: python pandas dataframe

我想根据列表从数据框中选择一些数据。我提到了很多问题,包括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'的会话值。(由于我只放置了部分数据帧,所以这些值不在这里)

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

然后我想回到df2并为'li'中的会话值获取相应的'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()

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

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

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

目前,看isin li试图查看是否数组中的4和10(而不是包含在其中)...事实上,这甚至看起来更糟糕查看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

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

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