如何根据ID和指向df2中列名称的值,从另一个数据帧(df2)中的列中获取值.Python/Pandas



所以我有这个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')

相关内容

最新更新