gpt4 book ai didi

python-3.x - 合并更改 Pandas 类型

转载 作者:行者123 更新时间:2023-12-04 01:52:19 25 4
gpt4 key购买 nike

我正在使用 Python 3(不知道信息是否相关)。
我有 2 个 Pandas DataFrames(来自 read_csv()):CompactSDSS_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'])
keydata都是 int64 .我创建了一个转码df:
trans=pd.DataFrame(data=[[1000000000000000000,2000000000000000000]], 
columns=['key','key2'])

其中 2 个键是 int64 .然后
df2 = pd.merge(df, trans, on=['key'], how='left')

给出了一个很好的结果,和 key , key2data还在 int64 .

尽管如此,如果我定义
df=pd.DataFrame(data=[[1000000000000000000,1],[1000000000000000001,2]],
columns=['key','data'])

现在合并后,我得到


现在 key2已切换到 float64 .如何防止这种情况?是不是因为 NaN必须与浮点连接?如果是这样,是否可以设置merge来定义合并结果为0或-1,如果没有对应,保持整列为 int64 ?

最佳答案

更新:在 Pandas 0.24 中,现在有 Nullable integer data types .
在撰写本文时,Pandas 似乎没有为合并结果选择可为空的 int 数据类型。但是可以将两个数组都转换为可为空的 int 类型 Int64合并前。
考虑

df=pd.DataFrame(data=[[1000000000000000000,1],[1000000000000000001,2]],
columns=['key','data']).astype("Int64")
trans=pd.DataFrame(data=[[1000000000000000000,2000000000000000000]],
columns=['key','key2']).astype("Int64")
df2 = pd.merge(df, trans, on=['key'], how='left')
结果:
>>> df2
key data key2
0 1000000000000000000 1 2000000000000000000
1 1000000000000000001 2 <NA>

>>> df2.dtypes
key Int64
data Int64
key2 Int64
dtype: object

原答案 ,对于 Pandas < v0.24:

Is it because NaN must be connected with a float ?


正确的。 int 中没有 NaN 值,因此缺失值只能用浮点数表示。
您可以在合并之前过滤数据,确保没有创建 NaN。
或者您可以在合并后使用您选择的值填充 NaN,然后​​恢复 dtype。

关于python-3.x - 合并更改 Pandas 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52455883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com