Применять типы DataFrame и разрешать NaN - PullRequest
1 голос
/ 27 марта 2019

Мне нужно инициализировать пустой пандус DataFrame с определенными типами данных для столбцов, а затем добавить в DataFrame несколько строк, которые могут содержать не все столбцы, но содержимое столбца должно быть тем, которое было объявлено при DataFrame.Есть ли способ сделать это?

record_list = [
                   { 'lastname'    : 'Ford',
          'firstname'  : 'Ana',
          'agreed'     : 0
                   },
                   { 'lastname'    : 'Snow',
          'agreed'     : 'a'
                    }
                    ]
    df = pd.DataFrame({
    'lastname'    : np.array([], dtype=np.object),
        'firstname'   : np.array([], dtype=np.object),                       
            'agreed'      : np.array([], dtype=np.int64)
                    })

for record in record_list:
    df = df.append([record], ignore_index=True)

Выше должно произойти сбой, потому что 'согласовано' является строкой, а не int, но если это было int, то NaN должен быть вставлен в кадр данных для второй записи, даже если тип является ул.Я также пробовал столбцы и dtype отдельно, но не работал.Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Вы можете использовать pd.to_numeric(), как показано ниже, для проверки после загрузки данных и обрабатывать их как вам:

df=df.append(record_list)
df.agreed=np.where(pd.to_numeric(df.agreed,errors='coerce').isna(),np.nan,df.agreed)
print(df)

  lastname firstname agreed
0     Ford       Ana      0
1     Snow       NaN    NaN
0 голосов
/ 27 марта 2019

Непонятно, что вы, наконец, хотите.Но я объясняю, что я понял.Думайте панды как традиционная база данных.Вы не можете поместить str и int в один столбец.Но по умолчанию в pandas, если в столбце с типом данных int есть NaN, данные всегда будут отображаться как десятичные числа Ex.0.0 Лучше сначала очистить данные и вставить их в новый список, а затем прочитать непосредственно на Dataframe.

new_data = []
for item in record_list:
    agrd = item.get("agreed", None)
    if isinstance(agrd, int):
        new_data.append(item)
    else:
        item["agreed"] = None
        new_data.append(item)

df = pd.DataFrame(new_data)

Результат:

   agreed firstname lastname
0     0.0       Ana     Ford
1     NaN       NaN     Snow

Поскольку есть NaN пандывсегда будет показывать десятичное число вместо целогоТаким образом, вы можете заменить NaN на df.<columnname>.fillna(value=-1), а затем преобразовать столбец, используя df["columnname"] = df.columnname.astype(int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...