处理Pandas数据后,如何将含dtype的数组元素转为纯订单号列表?
解决方法
问题原因
你用np.nditer遍历numpy数组时,取出的每个order是numpy标量对象(比如numpy.int64),直接添加到列表里就会显示成array(5555555, dtype=int64)格式。要得到纯数值列表,需要把这些标量转成Python原生的数值类型,或者换更简洁的pandas操作方式。
方法1:迭代时转换为原生类型
修改循环里的代码,把每个order转成int再添加,同时修正判断逻辑(原代码直接判断二维数组的in操作会失效):
import pandas as pd import numpy as np dataBI = pd.read_csv("U:/eu_inventory/EO BI Orders.csv") dataOrderTrimmed = dataBI.iloc[:,1:2].values dataVA05 = pd.read_csv("U:/eu_inventory/VA05_Export.csv") # 路径统一用/或转义\\,避免转义问题 dataVAOrderFlat = dataVA05.iloc[:,1:2].values.flatten() # 转成一维数组用于判断 ordersInBoth = [] ordersInBI = [] ordersInVA = [] for order in np.nditer(dataOrderTrimmed): order_val = int(order) if order_val in dataVAOrderFlat: ordersInBoth.append(order_val) else: ordersInBI.append(order_val)
方法2:提前转成Python列表再遍历
先把numpy数组转成纯Python列表,遍历直接拿到数值,同时用集合提升判断效率:
import pandas as pd import numpy as np dataBI = pd.read_csv("U:/eu_inventory/EO BI Orders.csv") # 转成一维Python列表 dataOrderList = dataBI.iloc[:,1:2].values.flatten().tolist() dataVA05 = pd.read_csv("U:/eu_inventory/VA05_Export.csv") # 转成集合,判断in操作的效率更高 dataVAOrderSet = set(dataVA05.iloc[:,1:2].values.flatten().tolist()) ordersInBoth = [] ordersInBI = [] for order in dataOrderList: if order in dataVAOrderSet: ordersInBoth.append(order) else: ordersInBI.append(order)
方法3:用pandas内置方法(最简洁高效)
完全不用手动循环,利用pandas的isin方法直接筛选,规避numpy类型问题:
import pandas as pd dataBI = pd.read_csv("U:/eu_inventory/EO BI Orders.csv") bi_orders = dataBI.iloc[:, 1] # 提取指定列作为Series dataVA05 = pd.read_csv("U:/eu_inventory/VA05_Export.csv") va_orders = dataVA05.iloc[:, 1] # 直接筛选交集、BI独有、VA独有的订单 ordersInBoth = bi_orders[bi_orders.isin(va_orders)].tolist() ordersInBI = bi_orders[~bi_orders.isin(va_orders)].tolist() ordersInVA = va_orders[~va_orders.isin(bi_orders)].tolist()
内容的提问来源于stack exchange,提问作者Kole Davis
相关产品推荐
相关产品推荐

