Pandas:删除缺少数据的行并在 UDF 中应用二进制编码

Posted

技术标签:

【中文标题】Pandas:删除缺少数据的行并在 UDF 中应用二进制编码【英文标题】:Pandas: Drop rows with missing data and apply binary encoding in UDF 【发布时间】:2021-05-27 17:25:00 【问题描述】:

在预处理数据的过程中。我将tf 值二进制编码为10。最初,这是我的功能:

def binary_encoding(df):
    encode = df.replace("t":1, "f":0)
    return encode

这会返回一个浮点数。然后我将编码行更改为

encode = df.replace("t":1, "f":0).astype(int)

但我得到一个错误

ValueError: Cannot convert non-finite values (NA or inf) to integer

在 4 列中,我是二进制编码,其中 3 列有 55 /18500 个缺失条目,并且 dtypes 是 float64。另一列已成功编码并被识别为 int64 并按预期完全映射。

如何编写一个函数来删除丢失的条目(即空白输入),然后应用最初设置的映射?

【问题讨论】:

您的数据框样本是必要的。给出更具体的解决方案,但类似于df.dropna().replace(....).astype(int) 【参考方案1】:

要解决将 NaN 列中的浮点值转换为整数的最终目标,您可以使用 integer with N/A support 数据类型:

假设您有 4 列,如下所示:

3 列有 NaN 值,1 列没有。

df = pd.DataFrame('Col1': ['f', 't', np.nan], 'Col2': [np.nan, 'f', 't'], 'Col3': ['f', np.nan, 't'], 'Col4': ['f', 't', 'f'])


  Col1 Col2 Col3 Col4
0    f  NaN    f    f
1    t    f  NaN    t
2  NaN    t    t    f

现在,在您的函数进行二进制编码之后:

def binary_encoding(df):
    return df.replace("t":1, "f":0)

new_df = binary_encoding(df)

print(new_df)


   Col1  Col2  Col3  Col4
0   0.0   NaN   0.0     0
1   1.0   0.0   NaN     1
2   NaN   1.0   1.0     0

new_df的数据类型:

new_df.dtypes

Col1    float64
Col2    float64
Col3    float64
Col4      int64
dtype: object

使用integer with N/A support数据类型的数据类型转换:

new_df_int = new_df.astype('Int64')


print(new_df_int)


   Col1  Col2  Col3  Col4
0     0  <NA>     0     0
1     1     0  <NA>     1
2  <NA>     1     1     0 

new_df_int 的数据类型:

new_df_int.dtypes

Col1    Int64
Col2    Int64
Col3    Int64
Col4    Int64
dtype: object

您现在拥有整数数据类型,并可以根据需要显示为整数!您现在不再需要删除丢失的条目/行。

您还可以将数据类型转换应用于单个列而不是整个日期帧,例如:

new_df['Col1'] = new_df['Col1'].astype('Int64')

【讨论】:

TypeError:对象无法转换为 IntegerDtype。我真的被困了7个小时。我已经尝试过,在出现空字符串时删除行,然后再次尝试,但我似乎无法得到我正在寻找的结果。我可以在函数之外对其进行硬编码,但我必须在其中编写它。非常令人沮丧,但我真的很感激你的努力 @DropKick 您的数据仅包含数值还是字符串/字符?我看到你提到你有 4 列,3 列浮点数,1 列 int。所以,应该都是数字吧? df.dtypes:int64,对象,float64。数据包含字符串、分类数据(例如't'、'f')和int 和float 中的数字。仅供参考:价格、地址、名称、评级。它的 Air BnB 数据如果能给你一个想法。我正在尝试隐藏 4 列,“host_is_superhost”等,其中包含数据“t”“f”。我差点把自己扔出窗外大声笑 @DropKick 你现在可以转换浮点类型的列吗?这些对象类型如果是字符串或字符,则不能像往常一样转换为整数。 @DropKick 所以,如果你的数据只有0.0s1.0sNaN,你应该可以使用.astype('Int64')。在应用 .astype('Int64') 时尝试排除具有 object dtype 的列

以上是关于Pandas:删除缺少数据的行并在 UDF 中应用二进制编码的主要内容,如果未能解决你的问题,请参考以下文章

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行

遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列

抓取两个日期时间之间的行并避免迭代

pandas 数据框的颜色行并转换为 HTML 表