在Python中有条件地从具有不同大小的数据帧创建列

在Python中有条件地从具有不同大小的数据帧创建列,python,pandas,dataframe,Python,Pandas,Dataframe,我有如下数据帧: df = pd.DataFrame({'buck' : ['3', '3', '3', '2', '2', '1', '1', '1', '0', '0'], 'rank' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}) df2 = pd.DataFrame({'col_no' : ['mr.A', 'mr.B', 'mr.C', 'mr.D', 'mr.E', 'mr.F', 'mr.G'],

我有如下数据帧:

df = pd.DataFrame({'buck' : ['3', '3', '3', '2', '2', '1', '1', '1', '0', '0'], 
                   'rank' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
df2 = pd.DataFrame({'col_no' : ['mr.A', 'mr.B', 'mr.C', 'mr.D', 'mr.E', 'mr.F', 'mr.G'],
                    'grade' : ['H', 'H', 'M', 'M', 'L', 'L', 'L']})
我想根据
df
df2
中的条件,使用
中的
'col\u no'
在df中创建一个列。 条件如下:

  • df['buck']==3和df2['grade']==H'
  • df['buck']==2和df2['grade']==M'
  • (df['buck']==1或df['buck']==0)和df2['grade']==L'
  • 如果满足条件->>循环通过
    df2['col_no']
    ,并重复输入相应的值

    例如,条件1的唯一值是mr.A和mr.B

    所需的输出将是:

    buck     rank     col_no        
    3        1        mr.A        
    3        2        mr.B       
    3        3        mr.A
    2        4        mr.C
    2        5        mr.D
    1        6        mr.E        
    1        7        mr.F     
    1        8        mr.G        
    0        9        mr.E
    0        10       mr.F
    
    我是Python新手,不知道解决这个问题的关键词是什么。我能想到的唯一选择是编写一个硬代码,循环遍历每一行,而不是使用Panda编码风格

    因此,任何建议都将不胜感激。
    提前谢谢

    我将使用映射和转换函数

    grades = {'3': 'H', '2': 'M', '1': 'L', '0': 'L'}
    
    def trans(x):
        ln = len(x)
        grade = grades[x.name]         # find the corresponding grade
        data = df2[df2['grade'] == grade, 'col_no'].to_list() # extract matching data from df2
        data *= (ln // len(data)) + 1  # repeat as required
        return data[:ln]               # and return the expected len
    
    那么就简单到:

    df.assign(col_no=df.groupby('buck')['buck'].transform(trans))
    
    正如预期的那样:

      buck  rank col_no
    0    3     1   mr.A
    1    3     2   mr.B
    2    3     3   mr.A
    3    2     4   mr.C
    4    2     5   mr.D
    5    1     6   mr.E
    6    1     7   mr.F
    7    1     8   mr.G
    8    0     9   mr.E
    9    0    10   mr.F
    

    如上所述,代码从
    GroupBy
    对象请求一个列,从
    transform
    调用的函数每次接收一个
    系列
    ,其中名称是组标识符(此处从
    '0'
    '3'
    )以及该列中相应值。

    有效!!非常感谢。你能解释一下x.name是做什么的吗?这是groupby的物品吗?@Eiboom:我已经编辑了我的帖子来更好地解释它。