【问题标题】:Pandas: Locating and updating values based on row contentPandas:根据行内容定位和更新值
【发布时间】:2016-06-23 20:54:51
【问题描述】:

我有以下格式的字典:

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

在 Pandas 中处理此问题的正确方法是什么?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    在布尔掩码 df 上使用 map 并传递将执行查找并将列与返回的 Series 的结果相乘的 dict:

    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
    

    【讨论】:

      【解决方案2】:

      我认为更好的条件是使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        相关资源
        最近更新 更多