代码之家  ›  专栏  ›  技术社区  ›  Daniel Morales

pandas替换引用用户输入的值

  •  0
  • Daniel Morales  · 技术社区  · 3 年前

    我有点困了,希望你能帮帮我,

    我想根据输入替换pandas df中的值

    Pandas df包含3个字符串列,类别的默认值始终为1

    面积 姓名 类别
    销售额 汤姆 1.
    财务 劳拉 1.
    财务 1.
    Ops 罗杰 1.

    我有一句格言={“金融”:“2”,“销售”:“3”,“ps”:“4”}

    例如,如果用户输入

    选择=“财务”

    df应该查找Area列中所有具有“finance”的行,并将默认的Category 1替换为dict中的相应值(在本例中为2)

    面积 姓名 类别
    销售额 汤姆 1.
    财务 劳拉 2.
    财务 2.
    Ops 罗杰 1.

    此外,如果用户输入一个列表:selection=[“财务”,“销售”],则应同时更改这两个选项:

    面积 姓名 类别
    销售额 汤姆 3.
    财务 劳拉 2.
    财务 2.
    Ops 罗杰 1.

    我怎么能这么做?,我试过将iloc和replace结合使用,但不知道。。。

    2 回复  |  直到 3 年前
        1
  •  0
  •   Kris    3 年前

    使用numpy where 如下:

    import numpy as np
    import pandas as pd
    
    # reproducible example
    df = pd.DataFrame()
    df['Area'] = ['Sales','Finance','Finance','Ops']
    df['Name'] = ['Tom','Laura','An','Roger']
    df['Category'] = [1,1,1,1]
    d = {'finance':2 ,'sales':3 ,'ops':4}
    
    selection = input("Please type in what areas you are searching for:")
    # assumes the user is typing in multiple areas split by space
    selection = selection.lower().split(" ")
    # loop through each selection and change the category
    for s in selection:
    # takes care of searches that aren't in the dictionary
        if s in d.keys():
            df['Category'] = np.where(df['Area'].str.lower()==s,d[s],df['Category'])
    

    例如,如果用户键入“ops Finance”,则输出为

        Area    Name    Category
    0   Sales   Tom     1
    1   Finance Laura   2
    2   Finance An      2
    3   Ops     Roger   4
    
        2
  •  0
  •   Joe Ferndz    3 年前

    您需要检查列表中的值是否是字典的一部分,如果是,您可以使用iloc选项查找该值并将其替换为新值。

    以下是完整的代码:

    c = ['Area','Name','Category']
    d = [['Sales','Tom',1],
    ['Finance','Laura',1],
    ['Finance','An',1],
    ['Ops','Roger',1]]
    
    dct = {'finance':'2' ,'sales':'3' ,'ops':'4'}
    
    import pandas as pd
    df = pd.DataFrame(d,columns=c)
    print (df)
    
    selection = ['Finance','Sales']
    
    #the if statement will ensure selection = 'Finance' gets converted to a list
    #that way the for loop is not impacted
    if isinstance(selection,str): selection = [selection]
    
    for cat in selection:
        if cat.lower() in dct:
            df.loc[df['Area'] == cat, 'Category'] = dct[cat.lower()]
    
    print (df)
    

    这些输出是:

    Input : selection = 'Finance'
    

    输出为:

          Area   Name Category
    0    Sales    Tom        1
    1  Finance  Laura        2
    2  Finance     An        2
    3      Ops  Roger        1
    

    输入:选择=[“财务”,“销售”]

    输出为:

          Area   Name Category
    0    Sales    Tom        3
    1  Finance  Laura        2
    2  Finance     An        2
    3      Ops  Roger        1
    

    如果你决定通过输入语句从用户那里获取输入,那么你可以添加以下代码(并替换赋值):

    替换此代码:

    selection = ['Finance','Sales']
    if isinstance(selection,str): selection = [selection]
    

    使用此代码:

    sel = input('What\'s the selection critiera :')
    selection = [s.capitalize() for s in re.split(r' |,',sel) if s != '']