我有以下Panda DataFrame。有两列CCD_ 1和CCD_。
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)]
我的问题是,我想根据元组列表中的值,即基于单个元组,对这个DataFrame进行子集设置。
如果我将基于B
的数据帧子集设置为具有元组(BB, 15, 183)
,则输出如下:
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 DataFrame中的值是元组,我如何根据列表中的值进行子集?
如果您使用pandas 0.25+,您可以使用explode
,它从每个单元格的列表中生成一个序列并将它们连接起来。类似于pd.concat(pd.Series(x) for x in df['B'])
,但保持原始索引。然后,您可以将该系列与您的三重和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
(:
0 (AA, 4, 11)
0 (ABC, 28, 99)
0 (ABC, 23, 86)
1 (AA, 2, 10)
2 (ABC, 56, 76)
2 (BB, 15, 183)
3 (BB, 15, 183)
Name: B, dtype: object
您可以通过应用方法来实现这一点:
df[df['B'].apply(lambda x: ('BB', 15, 183) in x)]