Pandas:根据行内容查找和更新值

时间:2016-03-09 12:59:36

标签: python pandas dataframe

我有以下格式的字典:

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

在熊猫中接近这个的正确方法是什么?

2 个答案:

答案 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