2016-10-29 3 views
3

У меня есть dataframe, как показано ниже:как сделать операцию на строку панды dataframe

df = pd.DataFrame({'a': [10, 11, None], 
        'b': ['apple;', None, 'orange;'], 
        'c': ['red', 'blue', 'green']}) 

Я пытаюсь обирать «;» из этих строк. Я попытался

df.select_dtypes(include=['object']).applymap(lambda x: x.strip(';')) 

Я получил сообщение об ошибке:

AttributeError: ("'NoneType' object has no attribute 'strip'", 'occurred at index b') 

Похоже, что никто не дал мне некоторые проблемы. Помощь очень ценится. Большое спасибо.

ответ

1

Проблема состоит в том, что некоторые значения являются None, и вы не можете Non.strip().

df.select_dtypes(include=['object']) 
     b  c 
0 apple; red 
1  None blue 
2 orange; green 

Что вы можете сделать, это strip только если объект не является None, в противном случае просто возвращает объект:

df.select_dtypes(include=['object']).applymap(lambda x: x.strip(';') if x else x) 
     b  c 
0 apple red 
1 None blue 
2 orange green 
+1

проблема с 'лямбда-х: x.strip («;»), если х еще x' является то, что вы будете иметь ATT ошибки ребра с другими объектами, которые ложны в смысле Python, а также не имеют метода '.strip'. Вы можете сделать lambda x: x.strip (';'), если hasattr (x, 'strip') else x', если вы хотите сделать это, сначала проверив тестирование. – dawg

+1

@ dawg, правильно. так как данные в примере содержат только строки, если 'if x' было достаточно. Другим вариантом является проверка 'if type (x) == str', чтобы убедиться, что' strip' будет только на строках (а не на других объектах, которые могут иметь функцию полосы, что мы не уверены, вернем ожидаемый результат). – Dekel

+0

это прекрасно. Большое спасибо! – zesla

1

В этом случае вы можете использовать try и except.

>>> def am(o): 
... try: 
...  return o.strip(';') 
... except AttributeError: 
...  return o 

Тогда applymap как вы попробовали:

>>> df.select_dtypes(include=['object']).applymap(am) 
     b  c 
0 apple red 
1 None blue 
2 orange green 
0

Используйте атрибут серии str и apply вместо applymap:

In [17]: df.select_dtypes(include=['object']).apply(lambda S:S.str.strip(';')) 
Out[17]: 
     b  c 
0 apple red 
1 None blue 
2 orange green 

In [18]: 
0

Другой подход заключается в перебирать все столбцы, которые dtype объекта и использование функция серии strip, которая обрабатывает NaN значения:

for col in df.columns[df.dtypes == object]: 
    df[col] = df[col].str.strip(";") 
Смежные вопросы