Pandas concat 将数据类型转换为对象而不是数字

问题描述 投票:0回答:1

我有一个数据集,分为 10 个不同的 .csv 文件。分别导入每个后,我使用 concat 将它们合并为一个。这会将每列转换为数据类型“object”。结果,当我使用 Keras model .fit 运行模型时,出现错误:ValueError: Failed to conversion a NumPy array to a Tensor (Unsupported object type int)。

对一个 .csv 文件运行完全相同的代码,这意味着无需连接,工作正常。

df1 = pd.read_csv("CSE-CIC-IDS2018/02-14-2018.csv", low_memory=False, nrows=10000)
df2 = pd.read_csv("CSE-CIC-IDS2018/02-15-2018.csv", low_memory=False, nrows=10000)
df3 = pd.read_csv("CSE-CIC-IDS2018/02-16-2018.csv", low_memory=False, nrows=10000)

df = pd.concat([df1,df2,df3])
df.drop(columns=['Timestamp','Flow ID', 'Src IP', 'Src Port', 'Dst IP'], inplace=True)

df.head()

Dst Port    Protocol    Flow Duration   Tot Fwd Pkts    Tot Bwd Pkts    TotLen Fwd Pkts TotLen Bwd Pkts Fwd Pkt Len Max Fwd Pkt Len Min Fwd Pkt Len Mean    ... Fwd Seg Size Min    Active Mean Active Std  Active Max  Active Min  Idle Mean   Idle Std    Idle Max    Idle Min    Label
0   0   0   112641719   3   0   0   0   0   0   0.0 ... 0   0   0   0   0   56320859.5  139.300036  56320958    56320761    Benign
1   0   0   112641466   3   0   0   0   0   0   0.0 ... 0   0   0   0   0   56320733.0  114.551299  56320814    56320652    Benign
2   0   0   112638623   3   0   0   0   0   0   0.0 ... 0   0   0   0   0   56319311.5  301.934596  56319525    56319098    Benign
    3   22  6   6453966 15  10  1239    2273    744 0   82.6    ... 32  0   0   0   0   0.0 0.0 0   0   Benign
    4   22  6   8804066 14  11  1143    2209    744 0   81.642857   ... 32  0   0   0   0   0.0 0.0 0   0   Benign

x = df.drop(["Label", axis=1)
y = df["Label"].apply(lambda x:0 if x=="Benign" else 1)

x_train, x_remaining, y_train, y_remaining = train_test_split(x,y, train_size=0.60, random_state=4)
x_val, x_test, y_val, y_test = train_test_split(x_remaining, y_remaining, test_size=0.5, random_state=4)

#Model
    model = Sequential()
    model.add(Dense(16, activation="relu"))#, input_dim=len(x_train.columns)))
    model.add(Dense(32, activation="relu"))
    model.add(Dense(units=1, activation="sigmoid"))
    #model.add(Dense(1, activation="softmax"))
    
    #Compiler
    model.compile(loss="binary_crossentropy", optimizer="Adam", metrics="accuracy")
    
    model.fit(x_train, y_train, epochs=10, batch_size=512)

ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)。

python pandas numpy tensorflow keras
1个回答
0
投票

您的其中一列不是数字。使用

x.select_dtypes
显示它们。

# Good case because x does not contain object columns
>>> x.select_dtypes(include='object').columns
Index([], dtype='object')

# Bad case because the list is not empty
>>> x.select_dtypes(include='object').columns
Index(['Protocol'], dtype='object')

如您所见,

Protocol
列有问题,因为它应该是数字。现在您知道了列名称,可以进行调试。尝试使用下面的代码来显示坏行。

>>> x.loc[pd.to_numeric(x['Protocol'], errors='coerce').isna(), 'Protocol']
3    tcp
Name: Protocol, dtype: object

例如,您可以删除第 3 行并将该列转换为整数:

x = x.drop(3).astype({'Protocol': int})

但是,为了确保具有唯一索引并确定坏行,请使用

ignore_index=True
作为
pd.concat
的参数:

df = pd.concat([df1, df2, df3], ignore_index=True)
© www.soinside.com 2019 - 2024. All rights reserved.