在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:我已经编辑了我的帖子来更好地解释它。