Python 基于列中列表中的值选择dataframe的部分

Python 基于列中列表中的值选择dataframe的部分,python,pandas,dataframe,Python,Pandas,Dataframe,经过一段时间的搜索,我找不到一个答案,必须是一个共同的问题,所以欢迎指点 我有一个数据帧: df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]}) 我想选择其中的一个子集(一些行),在“C”列的列表中有值,这些值出现在我感兴趣的事物列表中。e、 g listOfInterestingThings = [a, g] 因此,当应用过滤器时,我会有一个d

经过一段时间的搜索,我找不到一个答案,必须是一个共同的问题,所以欢迎指点

我有一个数据帧:

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]})
我想选择其中的一个子集(一些行),在“C”列的列表中有值,这些值出现在我感兴趣的事物列表中。e、 g

listOfInterestingThings = [a, g]
因此,当应用过滤器时,我会有一个df1:

df1 = 
A  B      C    
5  1  ['a','b']
3  3  ['g','h']
我正在处理的数据帧是以当前df格式将大量原始数据导入RAM~12GB。磁盘上大约有一半是json文件。

我完全同意

作为最后手段,您可以使用以下方法:

In [21]: df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index) \
                  .isin(listOfInterestingThings).any(1)]
Out[21]:
   A  B       C
0  5  1  [a, b]
2  3  3  [g, h]
或:

说明:

In [22]: pd.DataFrame(df.C.values.tolist(), index=df.index)
Out[22]:
   0  1
0  a  b
1  b  c
2  g  h
3  x  y

In [23]: pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings)
Out[23]:
       0      1
0   True  False
1  False  False
2   True  False
3  False  False
我完全同意

作为最后手段,您可以使用以下方法:

In [21]: df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index) \
                  .isin(listOfInterestingThings).any(1)]
Out[21]:
   A  B       C
0  5  1  [a, b]
2  3  3  [g, h]
或:

说明:

In [22]: pd.DataFrame(df.C.values.tolist(), index=df.index)
Out[22]:
   0  1
0  a  b
1  b  c
2  g  h
3  x  y

In [23]: pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings)
Out[23]:
       0      1
0   True  False
1  False  False
2   True  False
3  False  False
这也适用于:

df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]

   A  B       C
0  5  1  [a, b]
2  3  3  [g, h]
基准:

time df.loc[df.C.apply(lambda x: len(set(x) & listOfInterestingThings)> 0)]

CPU times: user 873 µs, sys: 193 µs, total: 1.07 ms
Wall time: 987 µs

time df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]

CPU times: user 1.02 ms, sys: 224 µs, total: 1.24 ms
Wall time: 1.08 ms

time df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings).any(1)]

CPU times: user 2.58 ms, sys: 1.01 ms, total: 3.59 ms
Wall time: 5.41 ms
因此,简而言之,@MaxU的答案是最快的方法。

这同样有效:

df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]

   A  B       C
0  5  1  [a, b]
2  3  3  [g, h]
基准:

time df.loc[df.C.apply(lambda x: len(set(x) & listOfInterestingThings)> 0)]

CPU times: user 873 µs, sys: 193 µs, total: 1.07 ms
Wall time: 987 µs

time df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]

CPU times: user 1.02 ms, sys: 224 µs, total: 1.24 ms
Wall time: 1.08 ms

time df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings).any(1)]

CPU times: user 2.58 ms, sys: 1.01 ms, total: 3.59 ms
Wall time: 5.41 ms

因此,简而言之,@MaxU的答案是最快的方法。

标准警告:序列和数据帧中的非标量元素(如列表)没有很好的支持,可能导致神秘和意外的行为。警告工具@DSM很有趣。我不知道。你有什么建议吗。我所做的是在尝试一些ML来训练主题之前,对大型文本语料库进行基本的操作。数据约6GB的json文件。每个文档都由一个json元素表示,该元素带有“body”和“topics”标记,这些主题以列表的形式显示,例如[topic1”,“topic2']我使用pd.DataFrame.from_dict将数据加载到df。您对使用此结构操纵大型数据集的更好方法有何建议?标准警告:非标量元素(如列表)串联和数据帧没有很好的支持,可能导致神秘和意外的行为。警告工具@DSM很有趣。我不知道。你有什么建议吗。我所做的是在尝试一些ML来训练主题之前,对大型文本语料库进行基本的操作。数据约6GB的json文件。每个文档都由一个json元素表示,该元素带有“body”和“topics”标记,主题以列表的形式显示,例如,['topic1','topic2']I使用pd.DataFrame.from_dict将数据加载到df。您对使用此结构操作大型数据集的更好方法有何建议?