我想根据列表从数据框中选择一些数据。我已经提到了一些棘手的问题,包括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”和“会话”分组到另一个数据框中。
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()
这里有什么问题?
最佳答案
这是因为li是一个包含数组的列表:
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()