Pandas:删除整数和字符串混合类型系列中的所有字符串组件

Pandas: Drop all string components in a mixed typed series with integers and strings

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

这里说的是一个数据框:

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

那么'a'是一个有6个分量的混合类型序列。如何从 a 中删除所有“苹果”?我需要系列 = 1,2,3,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()

结果数据类型被迫更改为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,4,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

这也避免了错误地强制转换可能包含有效 int/float 的字符串元素,例如,如果该列中包含类似“12”的元素,假设这不是您想要的行为。

另外,如果你希望最终输出的是int类型,你可以这样映射:

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