我有以下DataFrame
A B C
1.0 abc 1.0
abc 1.0 abc
-1.11 abc abc
我有混合数据类型(float
和str
)。如何在<= -1
中删除值column A
。
如果由于混合数据类型
而执行以下操作,则会出现错误df['A'] = (df['A'] != "abc") & (df['A'] > -1)
TypeError: '>' not supported between instances of 'str' and 'int'
如何更改我的对象以使abc
成为str
和1.0
成为float
所以我可以:
(df['A'] != "abc") & (df['A'] > -1)
print(df['A'].dtype)
-> object
我想要预期的输出
df =
A B C
1.0 abc 1.0
abc 1.0 abc
NaN abc abc
答案 0 :(得分:3)
这个问题至少有几种不同的方法。
pd.DataFrame.loc
接受布尔系列,因此您可以通过pd.to_numeric
计算掩码并输入loc
设置器。
请注意,无需指定df['A'] != 'abc'
,因为mask
系列会将这些值转换为NaN
。
mask = pd.to_numeric(df['A'], errors='coerce') < -1
df.loc[mask, 'A'] = np.nan
print(df)
A B C
0 1 abc 1
1 abc 1 abc
2 NaN abc abc
见@Jan's solution。如果期望值为数字且仅在边缘情况下寻找替代处理,则此解决方案更可取。
答案 1 :(得分:2)
您可以使用一个小函数将值转换为数字:
import pandas as pd, numpy as np
df = pd.DataFrame({
'A': [1.0, 'abc', -1.11],
'B': ['abc', 1.0, 'abc'],
'C': [1.0, 'abc', 'abc']})
def change(value):
try:
v = float(value)
if v < -1:
value = np.nan
except ValueError:
pass
return value
df['A'] = df['A'].apply(change)
print(df)
这会产生
A B C
0 1 abc 1
1 abc 1 abc
2 NaN abc abc
答案 2 :(得分:0)
您需要符合条件的行的索引。您可以将系列转换为数字,这会将字符串转换为NaN
,然后查找您的条件并简单地删除该行。请注意,我们不会将NaN
的系列保存回数据框。
ser = pd.to_numeric(df['A'], errors='coerce')
df.loc[df['A']!='abc'].drop(list(ser[ser<=-1].index))
输出:
A B C
0 1.0 abc 1.0