问题描述
这让我抓狂。当我搜索有关在数据框中删除元素的提示时,没有任何关于混合类型系列的内容。
说这是一个数据框:
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)