Присваивание целых чисел полям фрейма данных `OverflowError: Python int слишком велик для преобразования в C без знака long` - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных df, который выглядит следующим образом:

                             var     val
    0            clump_thickness       5
    1             unif_cell_size       1
    2            unif_cell_shape       1
    3              marg_adhesion       1
    4     single_epith_cell_size       2
    5                bare_nuclei       1
    6                bland_chrom       3
    7              norm_nucleoli       1
    8                    mitoses       1
    9                      class       2
    11            unif_cell_size       4
    12           unif_cell_shape       4
    13             marg_adhesion       5
    14    single_epith_cell_size       7
    15               bare_nuclei      10
    17             norm_nucleoli       2
    20           clump_thickness       3
    25               bare_nuclei       2
    30           clump_thickness       6
    31            unif_cell_size       8
    32           unif_cell_shape       8
    34    single_epith_cell_size       3
    35               bare_nuclei       4
    37             norm_nucleoli       7
    40           clump_thickness       4
    43             marg_adhesion       3
    50           clump_thickness       8
    51            unif_cell_size      10
    52           unif_cell_shape      10
    53             marg_adhesion       8
    ...                      ...     ...
    204   single_epith_cell_size       5
    211           unif_cell_size       5
    215              bare_nuclei       7
    216              bland_chrom       7
    217            norm_nucleoli      10
    235              bare_nuclei  -99999
    257            norm_nucleoli       6
    324   single_epith_cell_size       8

Я хочу создать новый столбец, содержащий значения столбцов var и val, преобразованные в число,Я написал следующий код:

df['id'] = df.apply(lambda row: int.from_bytes('{}{}'.format(row.var, row.val).encode(), 'little'), axis = 1)

Когда я запускаю этот код, я получаю следующую ошибку:

df['id'] = df.apply(lambda row: int.from_bytes('{}{}'.format(row.var, row.val).encode(), 'little'), axis = 1)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/frame.py", line 4262, in apply
        ignore_failures=ignore_failures)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/frame.py", line 4384, in _apply_standard
        result = Series(results)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/series.py", line 205, in __init__
        default=np.nan)
      File "pandas/_libs/src/inference.pyx", line 1701, in pandas._libs.lib.fast_multiget (pandas/_libs/lib.c:68371)
      File "pandas/_libs/src/inference.pyx", line 1165, in pandas._libs.lib.maybe_convert_objects (pandas/_libs/lib.c:58498)
    OverflowError: Python int too large to convert to C unsigned long

Я не понимаю, почему.Если я запускаю

for column in df['var'].unique():
    for value in df['val'].unique():
        if int.from_bytes('{}{}'.format(column, value).encode(), 'little') > maximum:
            maximum = int.from_bytes('{}{}'.format(column, value).encode(), 'little')
        print(int.from_bytes('{}{}'.format(column, value), 'little'))
print()
print(maximum)

, я получаю следующий результат:

    65731626445514392434127804442952952931
    67060854441299308307031611503233297507
    65731626445514392434127804442952952931
    68390082437084224179935418563513642083
    69719310432869140052839225623793986659
    73706994420223887671550646804635020387
    16399285238650560638676108961167827102819
    67060854441299308307031611503233297507
    72377766424438971798646839744354675811
    75036222416008803544454453864915364963
    69719310432869140052839225623793986659
    16399285238650560638676108961167827102819
    76365450411793719417358260925195709539
    68390082437084224179935418563513642083
    76365450411793719417358260925195709539
    73706994420223887671550646804635020387
    83632281929131549175300318205721294812263623257187
    71048538428654055925743032684074331235
    75036222416008803544454453864915364963
    72377766424438971798646839744354675811
    277249955343544548646026928445812341
    256480767909405238131904943128931957
    266865361626474893388965935787372149
    287634549060614203903087921104252533
    64059424565585367137514643836585471605
    261673064767940065760435439458152053
    282442252202079376274557424775032437
    .....
    60968996531299
    69179002195346541894528099
    58769973275747
    62068508159075
    59869484903523

    6026341019714892551838472781928948268513458935618931750446847388019

На основании этих результатов я бы сказал, что преобразование в целые числа работает нормально.Кроме того, наибольшее созданное целое число не настолько велико, что оно может вызвать проблемы при вставке в фрейм данных, верно?

Вопрос: Как успешно создать новый столбец с вновь созданными целыми числами?Что я здесь не так делаю?

Редактировать: Хотя решение bws

  str(int.from_bytes('{}{}'.format(column, value).encode(), 'little'))

устраняет ошибку, у меня теперь есть новая проблема: все идентификаторы уникальны.Я не понимаю, почему это происходит, но у меня внезапно появилось 3000 уникальных идентификаторов, в то время как есть только 92 уникальные комбинации var / val.

1 Ответ

0 голосов
/ 28 сентября 2018

Я не знаю почему.Может быть, lamda по умолчанию использует int перед int64?У меня есть обходной путь, который может быть полезен для вас.

Преобразовать результат в строку ( объект ): df['id'] = df.apply(lambda row: str(int.from_bytes('{}{}'.format(row["var"], row["val"]).encode(), 'little')), axis = 1)

Это интересно знать: https://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html

uint64 Целое число без знака (от 0 до 18446744073709551615)

edit:

После прочтения последней ссылки я предполагаю, что при использовании цикла выиспользуя тип python int, а не int, использующий панд (происходят от numpy).Итак, когда вы работаете с Dataframe, вы используете типы, которые numpy предоставляет ...

Тип Int из numpy происходит из Object , поэтому я считаю, что правильный способ работы с большим целым числомэто использовать объект .

Это мой вывод, но, возможно, я ошибаюсь.

Изменить второй вопрос:

Простой пример работает:

d2 = {'val': [2, 1, 1, 2],
 'var': ['clump_thickness', 'unif_cell_size', 'unif_cell_size', 'clump_thickness']
}

df2 = pd.DataFrame(data=d2)

df2['id'] = df2.apply(lambda row: str(int.from_bytes('{}{}'.format(row["var"], row["val"]).encode(), 'little')), axis = 1)

Результат df2:

print (df2)
   val              var                                      id
0    2  clump_thickness  67060854441299308307031611503233297507
1    1   unif_cell_size    256480767909405238131904943128931957
2    1   unif_cell_size    256480767909405238131904943128931957
3    2  clump_thickness  67060854441299308307031611503233297507
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...