【问题标题】:Split mixed type DataFrame into two columns?将混合类型的 DataFrame 拆分为两列?
【发布时间】:2018-07-30 07:40:04
【问题描述】:

我正在处理我加载到 DataFrame 中的报告。报告的 SKU 列具有混合数据类型。我想根据单元格数据类型(str、int)将该列拆分为两个新列(SUBTOTAL 和 SKU)。

按照similar question 中的示例,我得到一个布尔列。好的

df['SUBTOTAL'] = df['SKU'].apply(lambda x: isinstance(x, str))

    SKU                     AMOUNT       SUBTOTAL
7   4410                    1            False
8   4200                    5            False
9   total                   6            True
11  4250                    0            False
12  4255                    0            False

我在 Jupyter Notebook 中执行此操作。这就是让我发疯的事情。如果我首先调用上面的行,然后df[]包装代码,然后重新运行那个单元格,我就会得到我想要的。

df['SUBTOTAL'] = df[df['SKU'].apply(lambda x: isinstance(x, str))]

    SKU                     AMOUNT       SUBTOTAL
7   4410                    1            NaN
8   4200                    5            NaN
9   total                   6            total
11  4250                    0            NaN
12  4255                    0            NaN

但是当我重新启动并全部运行时,我得到一个键错误

我几乎要在同一条线上跑两次,

df['SUBTOTAL'] = df['SKU'].apply(lambda x: isinstance(x, str))
df['SUBTOTAL'] = df[df['SKU'].apply(lambda x: isinstance(x, str))]

如何将混合类型的 DataFrame 拆分为两列?

最终结果应该是,

    SKU                     AMOUNT       SUBTOTAL 
7   4410                    1            NaN
8   4200                    5            NaN
9   NaN                     6            total
11  4250                    0            NaN
12  4255                    0            NaN

或者我可以添加一个新的 SKUb 列并删除、重命名等等。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    检查数字数据而不是检查字符串可能是一个更好的主意。您可以使用优化的pd.to_numeric + pd.Series.isnull 而不是apply + lambda

    s = df['SKU'].copy()  # make copy for later
    df['SKU'] = pd.to_numeric(df['SKU'], errors='coerce')  # gives nan for non-numeric data
    df['SUBTOTAL'] = np.where(df['SKU'].isnull(), s, np.nan)
    

    目前,您的代码不清楚。您正在尝试将数据框分配给系列,因为 df['SUBTOTAL'] 是系列,但 df[df['SKU'].apply(lambda x: isinstance(x, str))] 是数据框。不建议这样做。

    【讨论】:

    • 您正在尝试将数据框分配给系列。我明白你的意思了。
    • 这行得通,np.where(df2['ACCOUNT'].apply(lambda x: isinstance(x, str)), col, np.nan);
    • @xtian,是的,这也可以。但是apply + lambda 只是一个隐蔽的低效循环。 Pandas / NumPy 的主要好处是矢量化操作,这就是为什么我建议pd.to_numeric + isnull
    • 输入数据不正常。这些值是混合的,但并非无关紧要,因此您不能替换空值。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2015-02-06
    • 2022-01-03
    • 2019-11-17
    • 1970-01-01
    • 2019-02-02
    • 2019-05-18
    • 2016-11-17
    相关资源
    最近更新 更多