如何在参考表中查找特定的 Pandas dataframe 列值并将参考表值复制到 dataframe 中?

3

我有一张参考表格,是从一个.csv文件中导入到一个包含3列和约400行的数据框(df2)中的。我另外还有一个数据框(df),其中包含许多列和行。我想要查找参考表格中的某个值,并将其添加到df中相应的列中。

参考表格的数据格式如下:

MANUF   PRODTYPE        PRODCODE
 
ALPHA       1           ALPHA1
ALPHA       2           ALPHA2
BETA        1           BETA1
BETA        2           BETA2
DELTA       1           DELTA1
DELTA       2           DELTA2


数据框(df)的设置如下:
MANUF    PRODTYPE    SERIALNO   PRODCODE    INVENTORY   
ALPHA       1        00001                      5
ALPHA       2        00001                      3
BETA        1        00001                      4
DELTA       1        00001                      8
ALPHA       2        00002                      3
BETA        1        00002                      4
DELTA       2        00001                      9
DELTA       2        00002                      9
DELTA       1        00002                      8
BETA        2        00001                      12
ALPHA       2        00003                      3

我试图根据参考表中的 MANUF 和 PRODTYPE 值,为 df 中的 PRODCODE 填充适当的值。
我尝试了:
df3 = df.merge(df2, how='left') 

并且

df3 = df2.merge(df, how='left')

但是两者都给出了不准确或不完整的合并结果。

2个回答

0
我预计这在你的情况下可以工作:
import sys
import pandas as pd
from io import StringIO
from datetime import datetime

data1 = StringIO("""MANUF;PRODTYPE;PRODCODE
ALPHA;1;ACME1
ALPHA;2;ACME2
BETA;1;BETA1
BETA;2;BETA2
DELTA;1;DELTA1
DELTA;2;DELTA2
""")
df1 = pd.read_csv(data1, sep=";")
print(df1)

data2 = StringIO("""MANUF;PRODTYPE;SERIALNO;PRODCODE;INVENTORY   
ALPHA;1;00001;5
ALPHA;2;00001;3
BETA;1;00001;4
DELTA;1;00001;8
ALPHA;2;00002;3
BETA;1;00002;4
DELTA;2;00001;9
DELTA;2;00002;9
DELTA;1;00002;8
BETA;2;00001;12
ALPHA;2;00003;3
""")
df2 = pd.read_csv(data2, sep=";")
print(df2)

df3 = df2.merge(df1, on=['MANUF', 'PRODTYPE'], how='left')
print(df3)

结果:

    MANUF  PRODTYPE  SERIALNO  PRODCODE_x  INVENTORY    PRODCODE_y
0   ALPHA         1         1           5           NaN      ACME1
1   ALPHA         2         1           3           NaN      ACME2
2    BETA         1         1           4           NaN      BETA1
3   DELTA         1         1           8           NaN     DELTA1
4   ALPHA         2         2           3           NaN      ACME2
5    BETA         1         2           4           NaN      BETA1
6   DELTA         2         1           9           NaN     DELTA2
7   DELTA         2         2           9           NaN     DELTA2
8   DELTA         1         2           8           NaN     DELTA1
9    BETA         2         1          12           NaN      BETA2
10  ALPHA         2         3           3           NaN      ACME2

谢谢您的快速回复。由于某种原因,它只拉取了大约1200条记录的PRODCODE,而不是20K条记录中的所有记录。其余在合并中都是空白,并且现在该文件有两列PRODCODE_x和PRODCODE_y,其中PRODCODE_x完全为空白,而PRODCODE_y具有1200个值。当我运行以下代码时,得到的结果与此相同:df3 = df2.merge(df, how='left') - Tac147
我已经更新了我的答案。上面的代码对你是否起作用? - René
它有点像。谢谢。然而,也许我过于简化了我的问题。最终,我将专注于的主键是序列号,并且每个序列号关联着大约30个不同的列,并且还在增长中。我正在尝试找到一种方法来完成这个任务,而不会过于复杂,因为数据的维度将随着时间的推移而不断增长。基本上,我正在尝试使用数据范围为df2来完成这个任务。https://exceljet.net/formula/vlookup-with-multiple-criteria - Tac147
你看了我的解决方案吗?或者在真正复杂的数据中是否存在相同的问题? - Rabinzel

0

另一种不使用merge的方法是这样的:

df2 = df2.set_index(['MANUF', 'PRODTYPE'])
output = df2.combine_first(df1.set_index(['MANUF', 'PRODTYPE'])).reset_index()
print(output)

    MANUF  PRODTYPE  INVENTORY PRODCODE  SERIALNO
0   ALPHA         1          5   ALPHA1         1
1   ALPHA         2          3   ALPHA2         1
2   ALPHA         2          3   ALPHA2         2
3   ALPHA         2          3   ALPHA2         3
4    BETA         1          4    BETA1         1
5    BETA         1          4    BETA1         2
6    BETA         2         12    BETA2         1
7   DELTA         1          8   DELTA1         1
8   DELTA         1          8   DELTA1         2
9   DELTA         2          9   DELTA2         1
10  DELTA         2          9   DELTA2         2

使用的输入:

df1 = pd.DataFrame({'MANUF': {0: 'ALPHA',
  1: 'ALPHA',
  2: 'BETA',
  3: 'BETA',
  4: 'DELTA',
  5: 'DELTA'},
 'PRODTYPE': {0: 1, 1: 2, 2: 1, 3: 2, 4: 1, 5: 2},
 'PRODCODE': {0: 'ALPHA1',
  1: 'ALPHA2',
  2: 'BETA1',
  3: 'BETA2',
  4: 'DELTA1',
  5: 'DELTA2'}})

df2 = pd.DataFrame({'MANUF': {0: 'ALPHA',
  1: 'ALPHA',
  2: 'BETA',
  3: 'DELTA',
  4: 'ALPHA',
  5: 'BETA',
  6: 'DELTA',
  7: 'DELTA',
  8: 'DELTA',
  9: 'BETA',
  10: 'ALPHA'},
 'PRODTYPE': {0: 1,
  1: 2,
  2: 1,
  3: 1,
  4: 2,
  5: 1,
  6: 2,
  7: 2,
  8: 1,
  9: 2,
  10: 2},
 'SERIALNO': {0: 1,
  1: 1,
  2: 1,
  3: 1,
  4: 2,
  5: 2,
  6: 1,
  7: 2,
  8: 2,
  9: 1,
  10: 3},
 'INVENTORY': {0: 5,
  1: 3,
  2: 4,
  3: 8,
  4: 3,
  5: 4,
  6: 9,
  7: 9,
  8: 8,
  9: 12,
  10: 3}})

这可能不是最有效的方法,但我通过运行迭代循环并使用匹配来使其工作。感谢您的帮助! - Tac147

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