Применить на Dataframe, возвращая все Нет - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь умножить значения столбца на 12, если эта строка / столбец не None.

Я пытался:

def length_inches(x):
    if x is not None:
        int(x)*12

df['LENGTH'] = df['LENGTH'].notnull().apply(length_inches)

И я пытался:

def length_inches(x):
    int(x)*12

df['LENGTH'] = df['LENGTH'].notnull().apply(length_inches)

Но он возвращает все None в столбце Длина.

Вот мой фрейм данных:

                                          DESCRIPTION  LENGTH  WIDTH   GAUGE  \
0   STRETCH FILM BENCHMARK GREEN   28.5" X 10000' ...   10000  28.5      51    
1   STRETCH FILM TORQUE            16X1500 4RL/CS ...    1500    16    31.5    
2   STRETCH FILM TORQUE            16X1500 4RL/CS ...    1500    16    31.5    
3   STRETCH FILM TORQUE            16X1500 4RL/CS ...    1500    16    31.5    
4   STRETCH FILM BENCHMARK OPTIMUM 30 X 7500'  20R...    7500    30      61    
5   STRETCH FILM TORQUE            16X1500 4RL/CS ...    1500    16    31.5    
6   STRETCH FILM TORQUE            16X1500 4RL/CS ...    1500    16    31.5    
7   STRETCH FILM BENCHMARK OPTIMUM 20" X 7500'  40...    None   None    None   

Как я могу учесть значения None в этом фрейме данных и по-прежнему выполнять вычисления на df['LENGTH']

Тип этого рядаLENGTH object

Если эта строка None, я бы хотел просто pass.

Ответы [ 4 ]

0 голосов
/ 08 июня 2018
 df['LENGTH']=df['LENGTH'].replace('None',0).astype(int)*12
0 голосов
/ 08 июня 2018

Вы должны вернуть значение в конце вашей функции.

Попробуйте:

def length_inches(x):
    if x is not None:
         return int(x)*12
0 голосов
/ 08 июня 2018

pd.Series.notnull выводит логический ряд в зависимости от того, является ли ваш ряд нулевым.Он не фильтрует серию для ненулевых значений.На самом деле такая явная фильтрация не нужна.Вы должны использовать векторизованные вычисления, как описано ниже, при работе с числовыми данными в Pandas.

Вероятно, вам нужно рассмотреть только пару сценариев:

1.серия с плавающей запятой => без преобразования

Если ваша серия float, т.е. df['LENGTH'].dtype возвращает тип float, не выполняйте преобразование или проверку.Просто используйте:

df['LENGTH'] *= 12

2.серия объектов => использовать pd.to_numeric

Если ваша серия имеет тип object, сначала преобразуйте ее в float:

df['LENGTH'] = pd.to_numeric(df['LENGTH'], errors='coerce')
df['LENGTH'] *= 12

pd.Series.apply спользовательская функция, с другой стороны, не векторизована: внутренне, это просто тонко завуалированный цикл.Избегайте этого, как чумы.

0 голосов
/ 08 июня 2018

Вы не return ничего из ваших функций (вы return Эд Нет ):

def length_inches(x):
    if x is not None:
        return int(x)*12
    else:
        return None

df['LENGTH'].apply(length_inches)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...