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生成的索引对齐问题。。。下面是我的解决方案,以了解更多详细信息。