【问题标题】:pandas astype key error on reverting column data type after merge合并后恢复列数据类型时的熊猫 astype 键错误
【发布时间】:2019-09-17 12:41:02
【问题描述】:

我有一个列名和数据类型的字典,如下所示:

{'ds': dtype('<M8[ns]'), 'sensor_id': dtype('int64'), 'm1': dtype('int64'), 'm2': dtype('float64')}

现在,我有一个合并的 pandas 数据框,其中还包含这些列,因为正确合并并由于 NaN 卷而更改了数据类型。

所以,我尝试恢复为原始数据类型,如下所示:

merged = merged.apply(lambda x: x.astype(original[x.name]) if x.name in data_types else x)

这里original 是原始数据框。

但是,当我这样做时,我得到了错误:

KeyError: ('Only the Series name can be used for the key in Series dtype mappings.', 'occurred at index ds')

【问题讨论】:

  • x.name 不会只是一个字符串吗?
  • 是的,但这不是我们想要的吗?
  • 你试过original = {'ds':'&lt;M8[ns]',...}吗?
  • 其实我只需要这样做:original[x.name].dtype。出于某种原因,我不喜欢在这里从不同的数据框传递一列。

标签: python pandas


【解决方案1】:

Series.astypedtype 作为输入,但您传递的 original[x.name] 是一个系列。

> df = pd.DataFrame(data={'A':range(5)})
> df['A'].astype(df['A']) ← What you are doing
KeyError: 'Only the Series name can be used for the key in Series dtype mappings.'

df['A'] 不是数据类型。您真正想要的是该系列的 dtype:df['A'].dtype。 lambda 中的x 相当于这里的df['A'],它是一个系列,因此original[x.name] 也是如此。您想要的是让 x 列获得 目标列的 dtype

> df['A'].dtype
dtype('int64')

> df['A'].astype('int32')
0    0
1    1
2    2
3    3
4    4
Name: A, dtype: int32 ← new 'int32' dtype

> df['A'].astype(df['A'].dtype) ← Use the dtype of the A column
0    0
1    1
2    2
3    3
4    4
Name: A, dtype: int64

因此,你需要的是:

merged = merged.apply(lambda x: x.astype(original[x.name].dtype) if x.name in data_types else x)

根据您的评论,从另一个 Dataframe 传递列(系列)不是问题。你根本不能传递一列。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2021-09-02
    • 1970-01-01
    • 2015-05-28
    • 2023-03-25
    相关资源
    最近更新 更多