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