创建并填充数据框列模拟 (excel) vlookup 函数

Create and populate dataframe column simulating (excel) vlookup function

我正在尝试在数据框中创建一个新列,并用另一个数据框列中的值填充它,该列与两个数据框列中的公共列相匹配。

DF1   DF2
A B   W B
———   ——— 
Y 2   X 2
N 4   F 4   
Y 5   T 5

虽然以下内容可以做到这一点。

df2[‘new_col’] = df1[‘A’] if df1[‘B’] == df2[‘B’] else “Not found”

所以结果应该是:

DF2
W B new_col
X 2 Y        -> Because DF1[‘B’] == 2 and value in same row is Y
F 4 N
T 5 Y

但我收到以下错误,我认为这是因为数据帧的大小不同?

raise ValueError("Can only compare identically-labeled Series objects”)

你能帮我理解我做错了什么以及实现我所追求目标的最佳方法是什么吗?

提前谢谢你。

更新 1 尝试 Corralien 解决方案我仍然得到以下结果:

ValueError: You are trying to merge on int64 and object columns. If you wish to proceed you should use pd.concat

这是我写的代码

df1 = pd.DataFrame(np.array([['x', 2, 3], ['y', 5, 6], ['z', 8, 9]]),
                   columns=['One', 'b', 'Three'])
                   
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])

df2.reset_index().merge(df1.reset_index(), on=['b'], how='left') \
       .drop(columns='index').rename(columns={'One': 'new_col'})

更新 2 这里是第二个选项,但是好像没有在df2中添加列。

df1 = pd.DataFrame(np.array([['x', 2, 3], ['y', 5, 6], ['z', 8, 9]]),
                   columns=['One', 'b', 'Three'])

df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])

df2 = df2.set_index('b', append=True).join(df1.set_index('b', append=True)) \
       .reset_index('b').rename(columns={'One': 'new_col'})

print(df2)


   b  a  c new_col Three
0  2  1  3     NaN   NaN
1  5  4  6     NaN   NaN
2  8  7  9     NaN   NaN

为什么上面的代码不起作用?

您的问题不清楚,为什么 F 与 N 关联,T 与 Y 关联?为什么 F 不带 Y 而 T 不带 N?

使用merge:

>>> df2.merge(df1, on='B', how='left')
   W  B  A
0  X  2  Y
1  F  4  N  # What you want
2  F  4  Y  # Another solution
3  T  4  N  # What you want
4  T  4  Y  # Another solution

您如何确定正确的值?有行索引?

更新

所以需要使用索引位置:

>>> df2.reset_index().merge(df1.reset_index(), on=['index', 'B'], how='left') \
       .drop(columns='index').rename(columns={'A': 'new_col'})

   W  B new_col
0  X  2       Y
1  F  4       N
2  T  4       Y

In fact you can consider the column B as an additional index of each dataframe.

使用join

>>> df2.set_index('B', append=True).join(df1.set_index('B', append=True)) \
       .reset_index('B').rename(columns={'A': 'new_col'})

   B  W new_col
0  2  X       Y
1  4  F       N
2  4  T       Y

设置:

df1 = pd.DataFrame([['x', 2, 3], ['y', 5, 6], ['z', 8, 9]],
                   columns=['One', 'b', 'Three'])

df2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                   columns=['a', 'b', 'c'])