Объединить изменения типов панд - PullRequest
0 голосов
/ 22 сентября 2018

Я использую Python 3 (не знаю, актуальна ли информация).У меня есть 2 кадра данных панд (от read_csv()): Compact и SDSS_DR7_to_DR8.Перед объединением они содержат следующие типы:

Compact.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2070 entries, 0 to 2069
Data columns (total 8 columns):
Group    2070 non-null int64
Id       2070 non-null int64
RA       2070 non-null float64
Dec      2070 non-null float64
z        2070 non-null float64
R        2070 non-null float64
G        2070 non-null float64
objid    2070 non-null int64
dtypes: float64(5), int64(3)
memory usage: 129.5 KB

И

SDSS_DR7_to_DR8.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 243500 entries, 0 to 243499
Data columns (total 5 columns):
specobjid    243500 non-null int64
dr8objid     243500 non-null int64
dr7objid     243500 non-null int64
ra           243500 non-null float64
dec          243500 non-null float64
dtypes: float64(2), int64(3)
memory usage: 9.3 MB

Я выполняю Compact=pd.merge(Compact, SDSS_DR7_to_DR8, left_on=['objid'], right_on=['dr8objid'], how='left').Он выполняется без ошибок, но в результате получается беспорядок.Когда я проверяю типы в новом DataFrame, я получаю следующее:

Compact.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2070 entries, 0 to 2069
Data columns (total 13 columns):
Group        2070 non-null int64
Id           2070 non-null int64
RA           2070 non-null float64
Dec          2070 non-null float64
z            2070 non-null float64
R            2070 non-null float64
G            2070 non-null float64
objid        2070 non-null int64
specobjid    1275 non-null float64
dr8objid     1275 non-null float64
dr7objid     1275 non-null float64
ra           1275 non-null float64
dec          1275 non-null float64
dtypes: float64(10), int64(3)
memory usage: 226.4 KB

Таким образом, во время слияния dr8objid (и некоторые другие) был (был) приведен к float64.Как это возможно, и что я могу сделать, чтобы предотвратить это (надеясь, что это источник беспорядка в слиянии)?

РЕДАКТИРОВАТЬ Итак, чтобы быть более конкретным: если я создаю df

df=pd.DataFrame(data=[[1000000000000000000,1]], columns=['key','data'])

key и data оба int64.Я создаю транскодирование df:

trans=pd.DataFrame(data=[[1000000000000000000,2000000000000000000]], 
                   columns=['key','key2'])

, 2 ключа которого int64.Тогда

df2 = pd.merge(df, trans, on=['key'], how='left')

дает хороший результат, а key, key2 и data по-прежнему int64.

Тем не менее, если я определю

df=pd.DataFrame(data=[[1000000000000000000,1],[1000000000000000001,2]],
                columns=['key','data'])

Теперь после слияния я получаю

и теперь key2 переключился на float64.Как это предотвратить?Это потому что NaN должно быть связано с поплавком?Если это так, возможно ли установить объединение, чтобы определить результат объединения равным 0 или -1, если нет соответствия, сохраняя весь столбец равным int64?

1 Ответ

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

Это потому, что NaN должен быть связан с поплавком?

Правильно.В int нет значения NaN, поэтому пропущенные значения могут быть представлены только в числах с плавающей запятой.

Вы можете отфильтровать данные перед объединением, убедившись, что NaN не созданы.

Иливы можете заполнить NaN значением по вашему выбору после слияния, а затем восстановить dtype.

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