我有以下格式的字典:
MyDict = {"string1" : 10, "string2" : 20, "string3" : 30, ...}
我还有一个大型DataFrame,格式如下:
col1 col2
0 string1 1
1 string2 2
2 string3 1
3 string1 3
4 string3 4
5 string1 5
我想找到col1!= string1的值,并根据行内容和我最初提到的字典更改值:
df.loc[df["col1"] != "string1" , "col2"] = df["col2"] * MyDict[df["col1"]]
(我立即意识到使用loc的上述用法是不可能的,果然: Series'对象是可变的,因此它们不能被散列)
所需输出的表示:
col1 col2
0 string1 1
1 string2 40
2 string3 30
3 string1 3
4 string3 120
5 string1 5
在熊猫中接近这个的正确方法是什么?
答案 0 :(得分:2)
在布尔掩码df上使用map
并传递将执行查找的dict,并将列与返回的Series的结果相乘:
In [273]:
MyDict = {"string1" : 10, "string2" : 20, "string3" : 30}
df.loc[df["col1"] != "string1" , "col2"] *= df['col1'].map(MyDict)
df
Out[273]:
col1 col2
0 string1 1
1 string2 40
2 string3 30
3 string1 3
4 string3 120
5 string1 5
答案 1 :(得分:1)
我认为更好的是使用str.contains
条件:
MyDict = {"string1" : 10, "string2" : 20, "string3" : 30}
df.loc[~df["col1"].str.contains("string1") , "col2"] *= df["col1"].map(MyDict)
print df
col1 col2
0 string1 1
1 string2 40
2 string3 30
3 string1 3
4 string3 120
5 string1 5