我有一个名为df
的DataFrame为
Order Number Status
1 1668 Undelivered
2 19771 Undelivered
3 100032108 Undelivered
4 2229 Delivered
5 00056 Undelivered
我希望在状态发送时将Status
列转换为布尔值(True
,并在状态未发送时将False
转换为NotANumber
但如果Status既不是'Undelivered'也不是'Delivered',那么它应被视为d = {
'Delivered': True,
'Undelivered': False
}
或类似的东西。
我想用dict
True
所以我可以轻松添加其他字符串,可以将其视为False
或{{1}}。
答案 0 :(得分:36)
您可以使用map
:
In [7]: df = pd.DataFrame({'Status':['Delivered', 'Delivered', 'Undelivered',
'SomethingElse']})
In [8]: df
Out[8]:
Status
0 Delivered
1 Delivered
2 Undelivered
3 SomethingElse
In [9]: d = {'Delivered': True, 'Undelivered': False}
In [10]: df['Status'].map(d)
Out[10]:
0 True
1 True
2 False
3 NaN
Name: Status, dtype: object
答案 1 :(得分:6)
replace
方法的示例,仅在指定的列C2
中替换值,并将结果作为DataFrame
类型。
import pandas as pd
df = pd.DataFrame({'C1':['X', 'Y', 'X', 'Y'], 'C2':['Y', 'Y', 'X', 'X']})
C1 C2
0 X Y
1 Y Y
2 X X
3 Y X
df.replace({'C2': {'X': True, 'Y': False}})
C1 C2
0 X False
1 Y False
2 X True
3 Y True
答案 2 :(得分:4)
您拥有所需的一切。您会很高兴发现replace
:
df.replace(d)
答案 3 :(得分:1)
扩展先前的答案:
d
字典中查找每一行的值,并将所有找到的键替换为d
中的值。 d
中没有键的值将设置为NaN
。可以使用fillna()
方法进行纠正。 pd.Series
的序列化来操作的。 d = {'Delivered': True, 'Undelivered': False}
df["Status"].map(d)
d
字典中查找每一行的值,并尝试将所有找到的键替换为d
中的值。 < / li>
d
中没有键的值将被保留。 pd.Series
或pd.DataFrame
对象)。 d = {'Delivered': True, 'Undelivered': False}
df["Status"].replace(d)
总体而言,替换方法更可靠,并且可以更好地控制数据映射方式以及如何处理缺失值或nan值。