2016-01-19 3 views
2

Предположим, у меня есть следующие dataframeПодменю панды dataframe со списком в ячейке

df = pd.DataFrame({'col1': ['one','one', 'one', 'one', 'two'], 
        'col2': ['two','two','four','four','two'], 
        'col3': [['alpha', 'beta'], 
          ['alpha', 'beta'], 
          ['alpha', 'beta'], 
          ['alpha', 'beta'], 
          ['alpha', 'nodata', 'beta', 'gamma']]}) 

Я знаю, что могу Подмножество с:

df[df['col2']=='four'] 

Как подмножество так, что она совпадает со строкой внутри список? в этом примере подмножество строк, которые не содержат «nodata» в col3?

df[~df['col3'].str.contains('nodata') 

, похоже, не работает, и я не могу нормально получить доступ к элементу «справа» внутри списка.

+0

Вы пытаетесь получить строку, содержащую «nodata» или все строки, которые этого не делают? Вы говорите, что хотите получить эту строку, но ваш примерный код отрицает это условие, подразумевая, что вам нужны строки, которые этого не содержат. – Matthew

+0

@matthew - исправлено – eatkimchi

ответ

0

Ваш код должен работать, если преобразовать тип данных столбца в строку:

df[~df['col3'].astype(str).str.contains('nodata')] 
+0

да это он! – eatkimchi

2

Вместо преобразования типов данных, которые можно использовать apply с lambda функцией, которая будет немного быстрее.

df[~df.col3.apply(lambda x: 'nodata' in x)] 

Тестирование это на большом наборе данных:

In [86]: df.shape 
Out[86]: (5000, 3) 

Мое решение:

In [88]: %timeit df[~df.col3.apply(lambda x: 'nodata' in x)] 
     1000 loops, best of 3: 1.68 ms per loop 

Предыдущее решение:

In [87]: %timeit df[~df['col3'].astype(str).str.contains('nodata')] 
     100 loops, best of 3: 7.8 ms per loop 

Вероятно, первый ответ может быть более читаемым, хотя ,

+0

согласен. лямбды весьма полезны. может быть, вы знаете место, где я смогу просветить лямбды питона и узнать их раз и навсегда? – eatkimchi

+0

Я бы, вероятно, начинал с [Документов Python] (https://docs.python.org/3/reference/expressions.html#lambda), а затем, возможно, google немного для [учебника] (http: // www. secnetix.de/olli/Python/lambda_functions.hawk). Ключ к тому, как он используется здесь, заключается в том, что это функция, которая применяется к каждому значению ячейки в 'df.col3' Удачи! – johnchase

+0

это даже быстрее (и вы можете потерять лямбда), если вместо этого вы используете понимание списка: 'df [['nodata' не в x для x в df.col3]]' – maxymoo