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

时间:2018-07-29 23:03:49

标签: python pandas dataframe

我正在处理我加载到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笔记本中进行此操作。这就是让我发疯的事情。如果我首先调用上述行,并用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列,然后拖放,重命名。

1 个答案:

答案 0 :(得分: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))]是数据帧。不建议这样做。