使用pandas将多个列映射到单个数据帧

3

我正在尝试创建一个数据框(例如df3),将薪资信息覆盖到人名上。我目前正在使用包含约1000个姓名的df1。以下是df1的示例。

    print df1.head() 

               Salary
    Name       
    Joe Smith  8700
    Jane Doe   6300
    Rob Dole   4700
    Sue Pam    2100
    Jack Li    3400

我还有一个df2,它会随机将df1中的人分配到队长和舵手列。

    print df2.head()

    Captain    Skipper
    Sue Pam    Joe Smith
    Jane Doe   Sue Pam
    Rob Dole   Joe Smith
    Joe Smith  Sue Pam
    Rob Dole   Jack Li

我该如何使用Python替换df2中的姓名为对应的薪水,以达到以下完全相同的格式。在Excel中,我会使用VLOOKUP函数,但我不知道如何在Python中实现。

print df3.head()   

    Captain    Skipper
    2100       8700
    6300       2100
    4700       8700
    8700       2100
    4700       3400
4个回答

1
我会利用pd.Series.map特性和stack相结合,将df2转变为一系列数据。之后再unstack回来。
  • stack df2,使其成为一系列数据
  • 使用 mapdf1.Salary
  • unstack 以恢复你的数据框

df2.stack().map(df1.Salary).unstack()

   Captain  Skipper
0     2100     8700
1     6300     2100
2     4700     8700
3     8700     2100
4     4700     3400

非常好,谢谢! - HelloMello27

1
你可以使用 df2[col].map(df1['Salary']) 来根据 df1['Salary'] 映射每个 df2 的列:
import pandas as pd
df1 = pd.DataFrame({'Salary':[8700,6300,4700,2100,3400]}, index=pd.Series(['Joe Smith', 'Jane Doe', 'Rob Dole', 'Sue Pam', 'Jack Li'], name='Name'))
df2 = pd.DataFrame({'Captain':['Sue Pam', 'Jane Doe',  'Rob Dole', 'Joe Smith', 'Rob Dole'], 'Skipper': ['Joe Smith',  'Sue Pam', 'Joe Smith', 'Sue Pam', 'Jack Li']})

df3 = pd.DataFrame({col: df2[col].map(df1['Salary']) for col in df2})
print(df3)

产生
   Captain  Skipper
0     2100     8700
1     6300     2100
2     4700     8700
3     8700     2100
4     4700     3400

1
你可以使用 df1.loc[name, 'Salary'] 查找每个姓名的工资。 使用 .applymap(),你可以对 df2 的所有条目和列执行此操作:
df3 = df2.applymap(lambda x: df1.loc[x, 'Salary'])
print(df3)

结果:

    Captain  Skipper
0     2100     8700
1     6300     2100
2     4700     8700
3     8700     2100
4     4700     3400

工作得很好。谢谢! - HelloMello27

0

dataframe.replace 方法比查找更适合。

>>> df1 = pd.DataFrame({'Salary':[8700,6300,4700,2100,3400]}, index=pd.Series(['Joe Smith', 'Jane Doe', 'Rob Dole', 'Sue Pam', 'Jack Li'], name='Name'))
>>> df2 = pd.DataFrame({'Captain':['Sue Pam', 'Jane Doe',  'Rob Dole', 'Joe Smith', 'Rob Dole'], 'Skipper': ['Joe Smith',  'Sue Pam', 'Joe Smith', 'Sue Pam', 'Jack Li']})
>>> df2.replace(df1.Salary)
   Captain  Skipper
0     2100     8700
1     6300     2100
2     4700     8700
3     8700     2100
4     4700     3400

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接