Pandas фрейм данных с динамически построенными столбцами и целочисленные данные с NaN? - PullRequest
0 голосов
/ 02 апреля 2020

Я видел Вставка строк в pandas DataFrame при сохранении типов данных столбцов , и я знаю, что

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

... но я не могу точно сказать из этих сообщений, есть ли решение для моего варианта использования:

Итак, я хочу динамически построить pandas DataFrame, начиная с одного определенного столбца, затем добавить дополнительные столбцы - все с целочисленными данными; из-за этого, очевидно, некоторые значения строки будут неопределенными, то есть NaN. Вот краткий пример:

import pandas as pd
print("pandas.__version__ {}".format(pd.__version__))

# initialize dataframe with one column
test_df = pd.DataFrame(columns=["time"])

# "append column" - add data with a newly defined column
test_df = test_df.append({'time': 20, 'varA': 14}, ignore_index=True)

# (same)
test_df = test_df.append({'time': 5673547, 'varB': 78}, ignore_index=True)

# (same)
test_df = test_df.append({'time': 9480530495459073, 'varC': 4567457}, ignore_index=True)

print(test_df)
print(test_df.astype(pd.Int64Dtype()))

Это печатает:

pandas.__version__ 1.0.2
          time  varA  varB       varC
0           20  14.0   NaN        NaN
1  5.67355e+06   NaN  78.0        NaN
2  9.48053e+15   NaN   NaN  4567457.0
               time  varA  varB     varC
0                20    14  <NA>     <NA>
1           5673547  <NA>    78     <NA>
2  9480530495459072  <NA>  <NA>  4567457

Итак, хотя я могу немного обойти это, построив DataFrame как float, затем приведу его к целому числу - обратите внимание, что я указал 9480530495459073 - и, тем не менее, после приведения я напечатал 9480530495459072, что является недопустимой ошибкой для моего варианта использования.

Есть ли у меня какие-либо другие варианты для создания DataFrame, подобного этому (с целым числом данные, а новые столбцы добавляются динамически - что приведет к отсутствию / неопределенности / NaN-значениям), чтобы он работал с целыми числами внутри? (или, возможно, работать с другими типами данных внутри, если я не теряю целочисленную точность?)

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Если вы хотите Int64, вы можете преобразовать свой словарь в серию с таким типом dtype:

# initialize dataframe with one column
test_df = pd.DataFrame(columns=["time"])

# append many times, create a function
def append(df, d):
    return df.append(pd.Series(d, dtype='Int64'), ignore_index=True)

# "append column" - add data with a newly defined column
test_df = append(test_df, {'time': 20, 'varA': 14})

# (same)
test_df = append(test_df, {'time': 5673547, 'varB': 78})

# (same)
test_df = append(test_df, {'time': 9480530495459073, 'varC': 4567457})

Вывод:

               time  varA  varB     varC
0                20    14   NaN      NaN
1           5673547  <NA>    78      NaN
2  9480530495459073  <NA>  <NA>  4567457
1 голос
/ 02 апреля 2020

Решение проблемы с добавлением его в качестве фактического кадра данных? При желании передайте dtype = 'int' в исходный файл test_df, если вы хотите, чтобы они не были объектами.

import pandas as pd
print("pandas.__version__ {}".format(pd.__version__))

# initialize dataframe with one column
test_df = pd.DataFrame(columns=["time"])

# "append column" - add data with a newly defined column
test_df = test_df.append(pd.DataFrame({'time': [20], 'varA': [14]}), ignore_index=True)

# # (same)
test_df = test_df.append(pd.DataFrame({'time': [5673547], 'varB': [78]}), ignore_index=True)

# # (same)
test_df = test_df.append(pd.DataFrame({'time': [9480530495459073], 'varC': [4567457]}), ignore_index=True)

print(test_df)
print(test_df.astype(pd.Int64Dtype()))

pandas.__version__ 1.0.1
               time  varA  varB       varC
0                20  14.0   NaN        NaN
1           5673547   NaN  78.0        NaN
2  9480530495459073   NaN   NaN        4567457.0
               time  varA  varB     varC
0                20    14  <NA>     <NA>
1           5673547  <NA>    78     <NA>
2  9480530495459073  <NA>  <NA>     4567457
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...