Я использую 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
?