将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python

Posted

技术标签:

【中文标题】将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python【英文标题】:Match one column with another data frame column and paste value from second data - Python 【发布时间】:2021-04-19 05:14:26 【问题描述】:

我有两个数据帧,一个包含数据,第二个包含代码及其解码值。我想将 df1[code] 与 df2[code] 匹配并将 df2[value] 粘贴到 df1 中。 应该注意的是,我的第二个数据帧包含一次代码和值,它基本上是一张代码和值,但在第一个数据帧中,代码是重复的,因此将粘贴的值列应该代表每次代码出现时的值在 df1[code] 列中。

df1[code] df2[code] df2[value]
234 000 Three
235 234 Two
238 238 Four
337 235 Five

我需要如下:

df1[code] df1[value]
234 Two
235 Five
238 Four
337 Null

基本上是从第二个数据帧转换一个数据帧中的代码。

【问题讨论】:

如果您有 2 个数据框 df1df2df1.merge(df2,on='Code') ,请查看合并。 你能显示你尝试的代码吗? 合并不起作用,因为 df1 有很多列,所以它会给出数据类型错误。 我也尝试将 df2 转换为字典。但随后匹配不会发生在 df1[code] 并且所有打印的值为 null\ 【参考方案1】:

假设您的数据框如下:

df1
   code     something  some_number
0   210  SOMETHING_28     0.206017
1   913  SOMETHING_36     0.810195
2   210  SOMETHING_18     0.258638
3  None             a     0.000000
df2
   code     value
0   210  VALUE_01
1   590  VALUE_02
2   614  VALUE_03
3   696  VALUE_04
4   913  VALUE_05

然后,您可以使用merge,根据需要更改code 列的类型(例如,如果它是一个字符串):

df1.code = df1.code.map(lambda x: np.int64(x) if x else np.nan).astype('Int64')
df2.code = df2.code.astype('Int64')
merged_df = df1.merge(df2, on='code', how='left')

你会得到:

   code     value
0   210  VALUE_01
1   913  VALUE_05
2   210  VALUE_01
3  <NA>       NaN

这里是创建 df1df2 的代码,其结构与此答案中显示的相同:

import pandas as pd
import numpy as np

codes = sorted(np.random.randint(1, 1000, 5))
values = [f'VALUE_x:02.0f' for x in range(1, len(codes) + 1)]

df1 = pd.DataFrame(
    data=[
        [c, f'SOMETHING_np.random.randint(1, 50)', np.random.random()]
        for c in np.random.choice(codes, 3)
    ],
    columns=['code', 'something', 'some_number']
)

df2 = pd.DataFrame(
    data=list(zip(codes, values)),
    columns=['code', 'value']
)

【讨论】:

您正在尝试合并 object 和 int64 列。如果你想继续,你应该使用 pd.concat .. 这是我得到@Piecot的错误 如果数据框与我在这里使用的不同,您应该提供一个数据框示例(及其列的实际类型)。也许你在某处有一些 nan 值...... 我已经更新了我的答案以处理codedf1 列中的字符串和空值【参考方案2】:

如何使用 map-dict:

map_dict = dict(zip(df2['code'], df2['value']))
df1['value'] = df1['code'].map(map_dict)

【讨论】:

以上是关于将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python的主要内容,如果未能解决你的问题,请参考以下文章

将一列中的文本与另一列匹配(vlookup + like)

将数据框的一列与另一列匹配,拉入其他列,组合成大数据集

Excel 2010 比较多列(2 列与其他 2 列)

Pandas Multiindex Groupby 聚合列与另一列的值

显示一列与另一列相比的缺失值

Pyspark如何将一列与数据框中另一列的结果相乘?