2016-07-09 3 views
5

Это похоже на простую задачу, но мне очень сложно удалить «» из всего моего фрейма данных и вернуть числовые значения в каждом столбце, включая числа, которые не имели ''. Dateframe включает в себя сотни более столбцов и выглядит короче:Удаление специальных символов в dataframe pandas

Time   A1  A2 
2.0002546296 1499 1592 
2.0006712963 1252 1459 
2.0902546296 1731 2223 
2.0906828704 1691 1904 
2.1742245370 2364 3121 
2.1764699074 2096 1942 
2.7654050926 *7639* *8196* 
2.7658564815 *7088* *7542* 
2.9048958333 *8736* *8459* 
2.9053125000 *7778* *7704* 
2.9807175926 *6612* *6593* 
3.0585763889 *8520* *9122* 

я не написал его перебрать каждый столбец в ДФ, но пока, насколько первая колонка идет, я пришел с этим

df['A1'].str.replace('*','').astype(float) 

, который дает

0  NaN 
1  NaN 
2  NaN 
3  NaN 
4  NaN 
5  NaN 
6  NaN 
7  NaN 
8  NaN 
9  NaN 
10  NaN 
11  NaN 
12  NaN 
13  NaN 
14  NaN 
15  NaN 
16  NaN 
17  NaN 
18  NaN 
19 7639.0 
20 7088.0 
21 8736.0 
22 7778.0 
23 6612.0 
24 8520.0 

есть очень простой способ, чтобы просто удалить «*» в dataframe в панд?

ответ

7

использование replace, который применяется на всей dataframe:

df 
Out[14]: 
     Time  A1  A2 
0 2.000255 1499 1592 
1 2.176470 2096 1942 
2 2.765405 *7639* *8196* 
3 2.765856 *7088* *7542* 
4 2.904896 *8736* *8459* 
5 2.905312 *7778* *7704* 
6 2.980718 *6612* *6593* 
7 3.058576 *8520* *9122* 

df=df.replace('\*','',regex=True).astype(float) 

df 
Out[16]: 
     Time A1 A2 
0 2.000255 1499 1592 
1 2.176470 2096 1942 
2 2.765405 7639 8196 
3 2.765856 7088 7542 
4 2.904896 8736 8459 
5 2.905312 7778 7704 
6 2.980718 6612 6593 
7 3.058576 8520 9122 
+2

Добавьте 'df = df.astype (float)' после замены, и у вас его есть. Я бы пропустил 'inplace' и просто выполнил' df = df.replace ('\ *', '', regex = True) .astype (float) 'и назвал его хорошим. – piRSquared

+0

@piRSquared - это плохая практика, использующая 'inplace'. – shivsn

+0

Нет. Просто предпочтение. В этом случае, когда вы использовали inplace, он не возвращался, позволяя цепочку. Без этого я смог подключить атеип (float) – piRSquared

0

Существует еще одно решение, которое использует карту и стрип-функции. Вы можете увидеть ссылку ниже: Pandas DataFrame: remove unwanted parts from strings in a column.

df = 
    Time  A1  A2 
0 2.0  1258 *1364* 
1 2.1  *1254* 2002 
2 2.2  1520 3364 
3 2.3  *300* *10056* 

cols = ['A1', 'A2'] 
for col in cols: 
    df[col] = df[col].map(lambda x: str(x).lstrip('*').rstrip('*')).astype(float) 

df = 
    Time  A1  A2 
0 2.0  1258 1364 
1 2.1  1254 2002 
2 2.2  1520 3364 
3 2.3  300  10056 

Процедура разбора применяться только на нужных столбцах.

Смежные вопросы