Как поднабор кортежей в pandas DataFrame, учитывая списки кортежей? - PullRequest
1 голос
/ 25 февраля 2020

У меня есть следующий pandas DataFrame. Есть два столбца 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)]

Моя проблема заключается в том, что я хотел бы установить этот 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)]

Я попытался выполнить sh, используя

df[df.B.isin(('BB', 15, 183))]

Но это неправильно, так как он дает мне пустой DataFrame.

Как создать подмножество на основе значений в списке в pandas DataFrame, если значения являются кортежами?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Если вы работаете с 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
1 голос
/ 25 февраля 2020

Вы можете сделать это с помощью метода apply:

df[df['B'].apply(lambda x: ('BB', 15, 183) in x)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...