Pandas Series.rename не отражено в столбцах DataFrame - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь переименовать column, проверяя значения в определенных столбцах.Вот установка:

In [9]: import pandas as pd

In [10]: df = pd.DataFrame(
    ...:         {"unknown_field": ['bob@gmail.com', 'shirley@gmail.com', 'groza@pubg.com']}
    ...:     )

In [11]: df
Out[11]: 
       unknown_field
0      bob@gmail.com
1  shirley@gmail.com
2     groza@pubg.com

Используя validate_column(ser), который принимает объект Pandas.Series в качестве параметра, он проверяет значения в этом столбце и изменяет имя столбца этого конкретного столбца с предварительным-определенный набор имен столбцов.Для простоты в этом примере столбец проверяется как столбец email.

In [12]: def validate_column(ser):
    ...:     # Value validation method returns that this column is email column
    ...:     ser.rename('email', inplace=True)
    ...:     

Текущее имя unknown_field: unknown_field, и, как и ожидалось, имя изменяетсяemail после выполнения validate_column метода:

In [13]: df.unknown_field
Out[13]: 
0        bob@gmail.com
1    shirley@gmail.com
2       groza@pubg.com
Name: unknown_field, dtype: object

In [14]: validate_column(df.unknown_field)

In [15]: df.unknown_field
Out[15]: 
0        bob@gmail.com
1    shirley@gmail.com
2       groza@pubg.com
Name: email, dtype: object

Однако имена столбцов в df не изменяются, как я ожидал.В переменной df он по-прежнему называется unknown_field:

In [16]: df
Out[16]: 
       unknown_field
0      bob@gmail.com
1  shirley@gmail.com
2     groza@pubg.com

В настоящее время я использую следующий код, чтобы вручную изменить имя столбца в моей переменной df.

In [17]: for col in df.select_dtypes(object):
    ...:     df.rename(columns={col: df[col].name}, inplace=True)
    ...:     

In [18]: df
Out[18]: 
               email
0      bob@gmail.com
1  shirley@gmail.com
2     groza@pubg.com

In [19]: 

У меня такой вопрос:

Есть ли более эффективный / простой способ переименования Series и непосредственно отраженный в DataFrame?

Ответы [ 2 ]

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

Используйте функцию переименования dataframe и установите аргумент столбцов.

import pandas as pd
df = pd.DataFrame({"unknown_field": ['bob@gmail.com', 'shirley@gmail.com', 'groza@pubg.com']})
df = df.rename(columns={'unknown_field': 'email'})

Вывод:

    email
0   bob@gmail.com
1   shirley@gmail.com
2   groza@pubg.com
0 голосов
/ 26 июня 2018

Перепишите свою функцию, чтобы принять два параметра:

def validate_column(df, col_name):
    # Value validation method returns that this column is email column
    return df.rename({col_name : 'email'}, axis=1)

Теперь вызовите вашу функцию через DataFrame.pipe:

df.pipe(validate_column, col_name='unknown_field')

               email
0      bob@gmail.com
1  shirley@gmail.com
2     groza@pubg.com

Очень чисто.Это полезно, если вы хотите объединить проверки:

(df.pipe(validate_column, col_name='unknown_field')
   .pipe(validate_column, col_name='some_other_field')
   .pipe(validate_column, col_name='third_field')
)

... или изменить validate_column для проверки нескольких столбцов одновременно.

Обратите внимание, что переименование больше не выполняется ви любой результат, возвращаемый из pipe, должен быть возвращен обратно.

...