我正在尝试根据名称和日期从“高级”表中获取高级。资历表的列格式为“资历月/年”,因为它可以从一个月更改为另一个月。
我正在尝试:
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”对象不可调用。
如何在不为资历表中的日期创建新列的情况下解决此问题?
答案 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
列-没有Date
和Col2
列的所有列:
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