如何根据另一列中的值填充另一列中的值?

时间:2020-07-14 05:24:11

标签: python pandas dataframe

我有一个带有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中填充值?

这是我的预期输出。

enter image description here

2 个答案:

答案 0 :(得分:1)

使用.mapnp.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