Python 在给定元组列表的情况下,如何对数据帧中的元组进行子集划分?

Python 在给定元组列表的情况下,如何对数据帧中的元组进行子集划分?,python,pandas,tuples,subset,Python,Pandas,Tuples,Subset,我有以下数据框。有两列A和B由多个元组列表组成 import pandas as pd dictionary_input = {'A' : [5,6,3,4], 'B' : [[('AA', 4, 11), ('ABC', 28, 99), ('ABC', 23, 86)], [('AA', 2, 10)], [('ABC', 56, 76), ('BB', 15, 183)], [('BB', 15, 183)]],

我有以下数据框。有两列
A
B
由多个元组列表组成

import pandas as pd
dictionary_input = {'A' : [5,6,3,4], 
                    'B' : [[('AA', 4, 11), ('ABC', 28, 99), ('ABC', 23, 86)], [('AA', 2, 10)], [('ABC', 56, 76), ('BB', 15, 183)], [('BB', 15, 183)]], 
                    'C': [[('XYZ', 7, 9), ('XX',24, 33), ('BB', 179, 184)], [('XX',72, 75)], [('ABC',25, 45)], [('BB',91, 187)]]}

df = pd.DataFrame(dictionary_input)
print(df)
其结果是:

   A                                            B                                            C
0  5  [(AA, 4, 11), (ABC, 28, 99), (ABC, 23, 86)]  [(XYZ, 7, 9), (XX, 24, 33), (BB, 179, 184)]
1  6                                [(AA, 2, 10)]                               [(XX, 72, 75)]
2  3               [(ABC, 56, 76), (BB, 15, 183)]                              [(ABC, 25, 45)]
3  4                              [(BB, 15, 183)]                              [(BB, 91, 187)]
我的问题是,我想根据元组列表中的值(即基于单个元组)对该数据帧进行子集划分

如果我要根据
B
has tuple
(BB,15183)
对数据帧进行子集划分,那么以下将是输出:

   A                                            B                                            C
2  3               [(ABC, 56, 76), (BB, 15, 183)]                              [(ABC, 25, 45)]
3  4                              [(BB, 15, 183)]                              [(BB, 91, 187)]
我试图通过使用

df[df.B.isin(('BB', 15, 183))]
但这是错误的,因为它给了我一个空的数据帧


如果值是元组,如何基于DataFrame中列表中的值进行子集

如果您使用的是pandas 0.25+,则可以使用,它在每个单元格中从列表中生成一个系列,并将它们连接起来。类似于
pd.concat(df['B']中x的pd.Series(x))
,但保留原始索引。然后,您可以将该系列与您的三元组和
groupby
进行比较:

s = df['B'].explode()

df[(s == ('BB', 15, 183)).groupby(level=0).any()]
输出:

   A                               B                C
2  3  [(ABC, 56, 76), (BB, 15, 183)]  [(ABC, 25, 45)]
3  4                 [(BB, 15, 183)]  [(BB, 91, 187)]
输出(
s
):


如果您使用的是pandas 0.25+,则可以使用,它在每个单元格中从列表中生成一个系列,并将它们连接起来。类似于
pd.concat(df['B']中x的pd.Series(x))
,但保留原始索引。然后,您可以将该系列与您的三元组和
groupby
进行比较:

s = df['B'].explode()

df[(s == ('BB', 15, 183)).groupby(level=0).any()]
输出:

   A                               B                C
2  3  [(ABC, 56, 76), (BB, 15, 183)]  [(ABC, 25, 45)]
3  4                 [(BB, 15, 183)]  [(BB, 91, 187)]
输出(
s
):


可以通过应用方法执行此操作:

df[df['B'].apply(lambda x: ('BB', 15, 183) in x)]

可以通过应用方法执行此操作:

df[df['B'].apply(lambda x: ('BB', 15, 183) in x)]

在数据帧中包含元组列表也是错误的:-)在数据帧中包含元组列表也是错误的:-)谢谢您的回答!有关更多上下文,请参见
explode()
在这里做什么?
explode()
在每个单元格的列表中创建一个系列,并将它们连接起来。类似于
pd.concat(df['B']中x的pd.Series(x))
,但它保留了原始索引。因此,我们可以
groupby(level=0)
。这很有意义!(把这个解释放在答案里可以吗?我认为这是一个很好的解释。)谢谢你的回答!有关更多上下文,请参见
explode()
在这里做什么?
explode()
在每个单元格的列表中创建一个系列,并将它们连接起来。类似于
pd.concat(df['B']中x的pd.Series(x))
,但它保留了原始索引。因此,我们可以
groupby(level=0)
。这很有意义!(把这个解释放在答案里可以吗?我认为这是一个很好的解释。)