Pandas:删除缺少数据的行并在 UDF 中应用二进制编码
Posted
技术标签:
【中文标题】Pandas:删除缺少数据的行并在 UDF 中应用二进制编码【英文标题】:Pandas: Drop rows with missing data and apply binary encoding in UDF 【发布时间】:2021-05-27 17:25:00 【问题描述】:在预处理数据的过程中。我将t
和f
值二进制编码为1
和0
。最初,这是我的功能:
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.0s
和1.0s
和NaN
,你应该可以使用.astype('Int64')
。在应用 .astype('Int64')
时尝试排除具有 object dtype 的列以上是关于Pandas:删除缺少数据的行并在 UDF 中应用二进制编码的主要内容,如果未能解决你的问题,请参考以下文章
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行