我正在处理我加载到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列,然后拖放,重命名。
答案 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))]
是数据帧。不建议这样做。