Python 将数据帧值映射到另一个数据帧

Python 将数据帧值映射到另一个数据帧,python,pandas,Python,Pandas,我有这两个数据帧 data1 = [[1,'A'],[2,'B'],[3,'C'],[4,'D'],[5,'E']] data2 = [1,1,1,1,2,5,4,3] df1 = pd.DataFrame(data1,columns = ['one','two']) df2 = pd.DataFrame(data2,columns = ['one']) 我想把第一列的df2的所有值映射到第二列的df1。简单地说,我想用df1作为字典。我希望df2的输出像这样 one 0 A 1

我有这两个数据帧

data1 = [[1,'A'],[2,'B'],[3,'C'],[4,'D'],[5,'E']]
data2 = [1,1,1,1,2,5,4,3]
df1 = pd.DataFrame(data1,columns = ['one','two'])
df2 = pd.DataFrame(data2,columns = ['one'])
我想把第一列的df2的所有值映射到第二列的df1。简单地说,我想用df1作为字典。我希望df2的输出像这样

   one
0    A
1    A
2    A
3    A
4    B
5    E
6    D
7    C
  
我正在这样做

df2['one']= df2['one'].apply(lambda x: df1.two[df1.one == x])
这给了我输出

   one
0    A
1    A
2    A
3    A
4  NaN
5  NaN
6  NaN
7  NaN

所有A都是正确的,但为什么后者都是NaN?

试试这个,与将apply与lambda函数一起使用相比,它的语法和功能要好得多:

df2['one'].map(df1.set_index('one')['two'])
输出:

0    A
1    A
2    A
3    A
4    B
5    E
6    D
7    C
Name: one, dtype: object
     0    1    2    3    4
0    A  NaN  NaN  NaN  NaN
1    A  NaN  NaN  NaN  NaN
2    A  NaN  NaN  NaN  NaN
3    A  NaN  NaN  NaN  NaN
4  NaN    B  NaN  NaN  NaN
5  NaN  NaN  NaN  NaN    E
6  NaN  NaN  NaN    D  NaN
7  NaN  NaN    C  NaN  NaN
为什么你的方法不起作用。。。。请看以下内容的输出:

df2['one'].apply(lambda x: df1.two[df1.one == x])
输出:

0    A
1    A
2    A
3    A
4    B
5    E
6    D
7    C
Name: one, dtype: object
     0    1    2    3    4
0    A  NaN  NaN  NaN  NaN
1    A  NaN  NaN  NaN  NaN
2    A  NaN  NaN  NaN  NaN
3    A  NaN  NaN  NaN  NaN
4  NaN    B  NaN  NaN  NaN
5  NaN  NaN  NaN  NaN    E
6  NaN  NaN  NaN    D  NaN
7  NaN  NaN    C  NaN  NaN

由于索引仅在第一列中对齐,因此0。得到分配。在这里,您使用的是pd.Series.apply,您将lambda函数应用于一个系列的元素,并将其分配回一个数据帧,从而导致错误对齐问题。

试试这个,与使用lambda函数的apply相比,它的语法和功能要好得多:

df2['one'].map(df1.set_index('one')['two'])
输出:

0    A
1    A
2    A
3    A
4    B
5    E
6    D
7    C
Name: one, dtype: object
     0    1    2    3    4
0    A  NaN  NaN  NaN  NaN
1    A  NaN  NaN  NaN  NaN
2    A  NaN  NaN  NaN  NaN
3    A  NaN  NaN  NaN  NaN
4  NaN    B  NaN  NaN  NaN
5  NaN  NaN  NaN  NaN    E
6  NaN  NaN  NaN    D  NaN
7  NaN  NaN    C  NaN  NaN
为什么你的方法不起作用。。。。请看以下内容的输出:

df2['one'].apply(lambda x: df1.two[df1.one == x])
输出:

0    A
1    A
2    A
3    A
4    B
5    E
6    D
7    C
Name: one, dtype: object
     0    1    2    3    4
0    A  NaN  NaN  NaN  NaN
1    A  NaN  NaN  NaN  NaN
2    A  NaN  NaN  NaN  NaN
3    A  NaN  NaN  NaN  NaN
4  NaN    B  NaN  NaN  NaN
5  NaN  NaN  NaN  NaN    E
6  NaN  NaN  NaN    D  NaN
7  NaN  NaN    C  NaN  NaN

由于索引仅在第一列中对齐,因此0。得到分配。在这里,您使用的是pd.Series.apply,即在序列的元素上应用lambda函数,并将其分配回导致错误对齐问题的数据帧。

dict df1 columns并映射到df2

df2.one=df2.one.map(dict(zip(df1.one,df1.two)))

  one
0   A
1   A
2   A
3   A
4   B
5   E
6   D
7   C

dict df1列并映射到df2

df2.one=df2.one.map(dict(zip(df1.one,df1.two)))

  one
0   A
1   A
2   A
3   A
4   B
5   E
6   D
7   C

您可以通过执行联接来实现这一点

import pandas as pd

data1 = [[1,'A'],[2,'B'],[3,'C'],[4,'D'],[5,'E']]
data2 = [1,1,1,1,2,5,4,3]
df1 = pd.DataFrame(data1,columns = ['one','two'])
df2 = pd.DataFrame(data2,columns = ['one'])

print(df1)

print(df2)

merge_df = pd.merge(df1,df2, on=['one'])[['two']]
print(merge_df)

输出

两个 0 A 1A 2A 3A 4 B 5 C 6d
7 E

您可以通过执行连接来实现这一点

import pandas as pd

data1 = [[1,'A'],[2,'B'],[3,'C'],[4,'D'],[5,'E']]
data2 = [1,1,1,1,2,5,4,3]
df1 = pd.DataFrame(data1,columns = ['one','two'])
df2 = pd.DataFrame(data2,columns = ['one'])

print(df1)

print(df2)

merge_df = pd.merge(df1,df2, on=['one'])[['two']]
print(merge_df)

输出

两个 0 A 1A 2A 3A 4 B 5 C 6d
7 E

这正是我想要的,但为什么没有在我的案例中应用工作这正是我想要的,但为什么没有在我的案例中应用工作基本上,您面临一些由usign pd.Series生成的索引对齐问题。应用。。。下面是我的解决方案,以了解更多详细信息。基本上,您面临一些由usign pd.Series.apply生成的索引对齐问题。。。下面是我的解决方案,以了解更多详细信息。