如何使用映射函数根据列值从多个列获取值?

时间:2019-03-25 11:37:07

标签: python pandas

我正在尝试根据名称和日期从“高级”表中获取高级。资历表的列格式为“资历月/年”,因为它可以从一个月更改为另一个月。

我正在尝试:

import pandas as pd
df = pd.DataFrame({'Name': ['Tom', 'Sara', 'Eva', 'Jack', 'Laura'], 
                    'Date': ['1/1/2019', '2/1/2019', '2/20/2019', '2/20/2019', '2/10/2019']})
Seniority = pd.DataFrame({'Name': ['Tom', 'Sara', 'Eva'], 
                          'Col2': ['a','b','c'],
                          'Seniority 1/2019': ['1','2','3'],
                          'Seniority 2/2019': ['2','2','3']})

df.loc[df, 'Seniority'] = \
df['Name'].map(Seniority.set_index('Name')['Seniority ' + pd.DatetimeIndex(df['Date']).month.astype(str) + "/" + pd.DatetimeIndex(df['Date']).year.astype(str) ]).fillna("-")

我收到以下错误:

  

TypeError:“ DataFrame”对象不可调用。

如何在不为资历表中的日期创建新列的情况下解决此问题?

1 个答案:

答案 0 :(得分:1)

使用DataFrame.melt,将Series.dt.to_period的日期时间转换为merge,然后左键联接:

sen = Seniority.melt('Name', var_name='Date', value_name='new')
sen['Date'] = (pd.to_datetime(sen['Date'].str.replace('Seniority ', ''), format='%m/%Y')
                 .dt.to_period('m'))
print (sen)
   Name     Date new
0   Tom  2019-01   1
1  Sara  2019-01   2
2   Eva  2019-01   3
3   Tom  2019-02   2
4  Sara  2019-02   2
5   Eva  2019-02   3

df = df.assign(Date= pd.to_datetime(df['Date']).dt.to_period('m')).merge(sen, how='left')
print (df)
    Name     Date  new
0    Tom  2019-01    1
1   Sara  2019-02    2
2    Eva  2019-02    3
3   Jack  2019-02  NaN
4  Laura  2019-02  NaN

编辑:

您可以指定value_vars列-没有DateCol2列的所有列:

cols = Seniority.columns.difference(['Name','Col2'])
sen = Seniority.melt('Name', var_name='Date', value_name='new', value_vars=cols)
sen['Date'] = (pd.to_datetime(sen['Date'].str.replace('Seniority ', ''), format='%m/%Y')
                 .dt.to_period('m'))
print (sen)
   Name     Date new
0   Tom  2019-01   1
1  Sara  2019-01   2
2   Eva  2019-01   3
3   Tom  2019-02   2
4  Sara  2019-02   2
5   Eva  2019-02   3