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。您对使用此结构操作大型数据集的更好方法有何建议?