【发布时间】:2020-03-01 00:13:52
【问题描述】:
我在使用Int64 时注意到以下行为。有没有办法避免类型转换并保留 Int64 类型后合并?
df1 = pd.DataFrame(data={'col1': [1, 2, 3, 4, 5], 'col2': [10, 11, 12, 13, 14]}, dtype=pd.Int64Dtype())
df2 = pd.DataFrame(data={'col1': [1, 2, 3], 'col2': [10, 11, 12]}, dtype=pd.Int64Dtype())
df = df2.merge(df1, how='outer', indicator=True, suffixes=('_x', ''))
df1.dtypes
Out[8]:
col1 Int64
col2 Int64
dtype: object
df2.dtypes
Out[9]:
col1 Int64
col2 Int64
dtype: object
df.dtypes
Out[10]:
col1 object
col2 object
_merge category
dtype: object
我应该澄清一下,我正在寻找一个不涉及明确执行以下操作的答案:
for k, v in df1.dtypes.to_dict().items():
df[k] = df[k].astype(v)
【问题讨论】:
-
github.com/pandas-dev/pandas/issues/8596,我认为问题是什么时候做 external ,pandas 将列类型设置为将来的对象
np.nan -
升级熊猫。我在
0.24.2版本上尝试了您的代码,它保留了dtypes -
@Mstaino 我在 0.25.1。你没有使用 'Int64' - 你必须使用 'int64'。
-
不,我照原样复制了您的前两行代码。现在我正在检查我所做的是使用
df1.merge而不是df2.merge。奇怪 -
@Mstaino 这与 df1 包含所有 df2 并且如果我们要 isin() df1 和 df2 没有 nan 值(导致类型更改)这一事实有关 - 很难解释但是如果您尝试使用 isin() 从 df1 中删除所有 df2 会变得很明显 - 它会将列转换为浮点数。