所以我有这个df1:
ID State
1 AA
2 AA
3 ZF
3 CJ
和df2:
ID AA ZF CJ etc
1 9 8 77
2 7 6 5
3 8 88 6
我必须在df1中创建一个新列,将df2中的值如下所示:
ID State Value
1 AA 9
2 AA 7
3 ZF 88
3 CJ 6
我已经尝试了两个小时,但似乎找不到一种方法来根据df1的值引用df2上的列名[状态]。即使我能想出一种方法来做到这一点,值也会被ID过滤。。。棘手的事情。有什么帮助吗?
提前感谢
让我们试试这样的东西:
import pandas as pd
df1 = pd.DataFrame({'ID': {0: 1, 1: 2, 2: 3, 3: 3},
'State': {0: 'AA', 1: 'AA',
2: 'ZF', 3: 'CJ'}})
df2 = pd.DataFrame({'ID': {0: 1, 1: 2, 2: 3},
'AA': {0: 9, 1: 7, 2: 8},
'ZF': {0: 8, 1: 6, 2: 88},
'CJ': {0: 77, 1: 5, 2: 6}})
merged = df1.merge(
df2.set_index('ID')
.stack()
.reset_index()
.rename(columns={'level_1': 'State', 0: 'Value'}),
on=['ID', 'State']
)
print(merged.to_string(index=False))
merged
:
ID State Value
1 AA 9
2 AA 7
3 ZF 88
3 CJ 6
使用堆栈将df2
中的每个值获取到其自己的行中:
print(df2.set_index('ID')
.stack()
.reset_index()
.rename(columns={'level_1': 'State', 0: 'Value'}))
输出:
ID State Value
0 1 AA 9
1 1 ZF 8
2 1 CJ 77
3 2 AA 7
4 2 ZF 6
5 2 CJ 5
6 3 AA 8
7 3 ZF 88
8 3 CJ 6
然后这很容易与df1
合并
这里有一个使用loc
的选项
df1['value'] = df2.set_index('ID').stack().loc[(pd.MultiIndex.from_frame(df1))].to_numpy()
或
idx,cols = pd.factorize(df['State'])
df2.set_index('ID').reindex(df['ID']).reindex(cols,axis=1).to_numpy()[range(len(idx)),idx]
由于您想将第二个DataFrame的列映射到第一个DataFrame中的一行,因此需要首先转换第二个数据帧,我还建议删除"ID"列以方便:
df2.drop('ID', axis = 1, inplace = True)
df2 = df2.T
df2.columns = ['State', 'Value1', 'Value2', 'Value3']
final_df = pd.merge(df1, df2, on = 'State', how = 'left')