我有一个带有Mnth_id和四个财务季度列的数据框,我想基于Mnth_id在新列中填充值。就像Mnth_id为4(April)一样,设置new = Q1_A ...
df = pd.DataFrame({'Name':['Tom', 'nick', 'krish', 'jack'], 'Mnth_id':[6, 3, 7, 8], 'Q1_A' : [1,2,3,4], 'Q2_A' : [2,3,4,5], 'Q3_A' : [3,4,5,6], 'Q4_A' : [2,3,4,5], 'new' :0})
Name Mnth_id Q1_A Q2_A Q3_A Q4_A new
0 Tom 6 1 2 3 2 0
1 nick 3 2 3 4 3 0
2 krish 7 3 4 5 4 0
3 jack 8 4 5 6 5 0
这里是映射:
month2quarter = { 4:'Q1', 5:'Q1', 6:'Q1', 7:'Q2', 8:'Q2', 9:'Q2', 10:'Q3', 11:'Q3', 12:'Q3', 1:'Q4', 2:'Q4', 3:'Q4' }
如何根据月份ID在特定列的new中填充值?
这是我的预期输出。
答案 0 :(得分:1)
使用.map
和np.where()
:
输入:
import pandas as pd
df = pd.DataFrame({'Name':['Tom', 'nick', 'krish', 'jack'], 'Mnth_id':[6, 3, 7, 8], 'Q1_A' : [1,2,3,4], 'Q2_A' : [2,3,4,5], 'Q3_A' : [3,4,5,6], 'Q4_A' : [2,3,4,5], 'new' :0})
month2quarter = {4:'Q1', 5:'Q1', 6:'Q1', 7:'Q2', 8:'Q2', 9:'Q2', 10:'Q3', 11:'Q3', 12:'Q3', 1:'Q4', 2:'Q4', 3:'Q4'}
代码:
df['new'] = df['Mnth_id'].map(month2quarter)
df['new'] = np.where((df['new'] == 'Q1'), df['Q1_A'], df['new'])
df['new'] = np.where((df['new'] == 'Q2'), df['Q2_A'], df['new'])
df['new'] = np.where((df['new'] == 'Q3'), df['Q3_A'], df['new'])
df['new'] = np.where((df['new'] == 'Q4'), df['Q4_A'], df['new'])
df
输出:
Name Mnth_id Q1_A Q2_A Q3_A Q4_A new
0 Tom 6 1 2 3 2 1
1 nick 3 2 3 4 3 3
2 krish 7 3 4 5 4 4
3 jack 8 4 5 6 5 5
答案 1 :(得分:1)
从映射mapping
创建一个新的month2quarter
字典,该映射用于将列Mnth_id
中的值映射到相应的四分之一列,然后使用Series.map
映射该列Mnth_id
与该mapping
字典一起使用DataFrame.lookup
根据此映射列在数据框中查找值:
mapping = {k: v + '_A' for k, v in month2quarter.items()}
df['new'] = df.lookup(df.index, df['Mnth_id'].map(mapping))
结果:
Name Mnth_id Q1_A Q2_A Q3_A Q4_A new
0 Tom 6 1 2 3 2 1
1 nick 3 2 3 4 3 3
2 krish 7 3 4 5 4 4
3 jack 8 4 5 6 5 5