Pandas:删除带有整数和字符串的混合类型系列中的所有字符串组件 要将整数保留为整数类型而不将它们更改为浮点数:如果您使用 NaN 生成中间结果,如下所示:

问题描述

这让我抓狂。当我搜索有关在数据框中删除元素的提示时,没有任何关于混合类型系列的内容

说这是一个数据框:

import pandas as pd
df = pd.DataFrame(data={'col1': [1,2,3,4,'apple','apple'],'col2': [3,5,6,7,8]})
a = df['col1']

那么“a”是一个包含 6 个组件的混合类型系列。如何从 a 中删除所有“苹果”?我需要系列 = 1,4。

解决方法

要将整数保留为整数类型而不将它们更改为浮点数:

方法:过滤包含数值的行以保留(而不是将非数值转换为 NaN 然后删除 NaN。不同之处在于我们不会使用 NaN 获得中间结果,这会强制数值从整数变为浮点数。

a = pd.to_numeric(a[a.astype(str).str.isnumeric()])

结果:

结果数据类型保持为整数类型 int64

print(a)

0    1
1    2
2    3
3    4
Name: col1,dtype: int64

如果您使用 NaN 生成中间结果,如下所示:

a = pd.to_numeric(a,errors='coerce').dropna()

结果 dtype 被迫更改为 float 类型(而不是保留为整数)

0    1.0
1    2.0
2    3.0
3    4.0
Name: col1,dtype: float64
,

您可以按标签删除,其中标签包含索引值列表。

df = pd.DataFrame(data={'col1': [1,2,3,4,'apple','apple'],'col2': [3,5,6,7,8]})
df.reset_index(inplace=True)
print(df)

grouped=df.col1.str.isnumeric().eq(0)

labels=set([x for x in (grouped[grouped.values==True].index)])
if len(labels)>0:
    df = df.drop(labels=labels,axis=0)    

输出:

   index   col1  col2
0      0      1     3
1      1      2     4
2      2      3     5
3      3      4     6
4      4  apple     7
5      5  apple     8
,

您可以使用 apply 方法并使用 lambda 标记字符串,然后将它们替换为 NaN 之类的值以过滤掉它们。

import numpy as np

a = df['col1'].apply(lambda x: np.nan if isinstance(x,str) else x).dropna()

这段代码的作用是:

  • 它首先用 NaN 替换列中所有字符串实例
  • 然后删除 NaN

这也避免了错误地强制可能包含有效整数/浮点数的字符串元素,例如,如果列中有像“12”这样的元素,假设这不是您想要的行为。

此外,如果您希望最终输出为 int 类型,您可以像这样映射它:

a = df['col1'].apply(lambda x: np.nan if isinstance(x,str) else x).dropna().map(int)