在具有混合值的数据框架中区分0和False的简便方法

时间:2017-07-21 04:47:24

标签: python pandas dataframe

我的数据框中有一个列,其值为O,但False0的行在功能上有所不同。

我希望将df["col_name"] = df["col_name"].replace(0,2)False值转换为其他值

这样做的好方法是什么?

使用替换效果不佳

df["col_name"] = df["col_name"].replace(False,2)也会转换0

v[0]也会转换v.push_back(temp);

4 个答案:

答案 0 :(得分:6)

您可以使用mask将值替换为boolean mask - 此解决方案的优势是原始types已更改:

df = pd.DataFrame({'Col':[1, False, 0]})

df['Col'] = df['Col'].mask(df['Col'].astype(str) == '0', 2).replace(False, 3)
print (df)
   Col
0    1
1    3
2    2

使用dict str的解决方案,但Series.replace首先转换为str也可以,但通常会将所有值转换为d = {'0':'Zero', 'False':False} df = df['Col'].astype(str).replace(d) print (df) 0 1 1 False 2 Zero Name: Col, dtype: object 真实的数据可能有问题。

bools

我尝试使用astype创建更一般的解决方案,然后按isinstance检查df = pd.DataFrame({'Col':[1, False, 0, True,5]}) print (df) Col 0 1 1 False 2 0 3 True 4 5 m = df['Col'].apply(lambda x: isinstance(x, bool)) df['Col'] = df['Col'].mask(m, df['Col'].map({False:2, True:3})) print (df) Col 0 1 1 2 2 0 3 3 4 5

mapView.requestScreenshot();

答案 1 :(得分:4)

让我们使用astype

df = pd.DataFrame({'Datavalue':[1,False,0]})

df.Datavalue.astype(str) == "0"

输出:

0    False
1    False
2     True
Name: Datavalue, dtype: bool

df.loc[df.Datavalue.astype(str) == "0",'Datavalue'] = "Zero"

输出:

  Datavalue
0         1
1     False
2      Zero

答案 2 :(得分:4)

您可以转换为str类型,然后使用df.str.replace

In [223]: df = pd.DataFrame({'Col':[1, False, 0]})

In [224]: df.Col.astype(str).replace('0', 'Zero').replace('False', np.nan)
Out[224]: 
0       1
1     NaN
2    Zero

答案 3 :(得分:3)

使用jezrael的数据框df

df = pd.DataFrame({'Col':[1, False, 0]})

选项1
如果只有三个值,1,0或False,则bool类型与False

一样好
df.Col.mask(df.Col.apply(type) == bool, 2)

0    1
1    2
2    0
Name: Col, dtype: object

选项2
您可以使用python is运算符

False is 0

False

并像之前一样使用mask

df.mask(df.Col.apply(lambda x: x is False), 2)

0    1
1    2
2    0
Name: Col, dtype: object