Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将数据帧中拼写错误的字符串值与第二个数据帧中拼写正确的字符串值进行匹配和替换?_Python_Pandas_Numpy - Fatal编程技术网

Python 如何将数据帧中拼写错误的字符串值与第二个数据帧中拼写正确的字符串值进行匹配和替换?

Python 如何将数据帧中拼写错误的字符串值与第二个数据帧中拼写正确的字符串值进行匹配和替换?,python,pandas,numpy,Python,Pandas,Numpy,我需要用正确的拼写替换数据帧中大量拼写错误的值。这将是一个持续的过程,因为数据集将继续更新,因此需要尽可能高效地完成 首先想到了两个显而易见的解决方案: 1) dataframe.replace() 2) 使用不正确的值作为键将数据帧与另一个数据帧合并 由于多种原因,这些选项似乎不是解决我问题的实际方法 对于解决方案1(dataframe.replace()),我只是需要替换太多的值,以便在每次接收新数据时不断添加一行又一行的df.replace命令 对于解决方案2(合并数据帧),我有十几个列需

我需要用正确的拼写替换数据帧中大量拼写错误的值。这将是一个持续的过程,因为数据集将继续更新,因此需要尽可能高效地完成

首先想到了两个显而易见的解决方案:

1) dataframe.replace()

2) 使用不正确的值作为键将数据帧与另一个数据帧合并

由于多种原因,这些选项似乎不是解决我问题的实际方法

对于解决方案1(dataframe.replace()),我只是需要替换太多的值,以便在每次接收新数据时不断添加一行又一行的df.replace命令

对于解决方案2(合并数据帧),我有十几个列需要修改,因此我必须创建许多单独的数据帧,其中一些数据帧除了用作合并键的列的名称之外是相同的

下面是一个简单的示例,说明了我(理想情况下)将使用的两个数据帧

df1:

df2:

我想针对df2中的Old_Value列运行df1中的那些列(InputA和InputB),并用New_Value列中的相应值替换这些值

理想情况下,它将生成以下数据帧

df_最终版本:

ResponseID      InputA       InputB
-------------------------------------
|ABC123     |   CHICKEN   |  1      |
|DEF456     |   COW       |  2      |
|GHI789     |   DOG       |  3      | 
-------------------------------------
如果这确实是可能的,我无法想象解决方案会非常复杂。我的问题是,我甚至不知道这种类型的过程会被命名为什么,以便在某个地方寻找预先存在的答案。
谢谢

这是一个应用的案例:

df2.set_index('Old_Value', inplace=True)

df1.iloc[:,1:]  = df1.iloc[:, 1:].apply(lambda x: x.map(df2['New_Value']))
输出:

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3

请注意,
apply
本质上是列上的for循环,因此在这里使用它不会降低太多性能。

这是一个
apply
派上用场的情况:

df2.set_index('Old_Value', inplace=True)

df1.iloc[:,1:]  = df1.iloc[:, 1:].apply(lambda x: x.map(df2['New_Value']))
输出:

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3

请注意,
apply
本质上是列上的for循环,因此在此处使用它不会降低很多性能。

在此处使用
map
将旧值映射到新值。唯一的诀窍是您需要多个列。因此,我们必须在这里使用
apply

final = df1.set_index('ResponseID')\
           .apply(lambda x: x.map(df2.set_index('Old_Value')['New_Value']))\
           .reset_index()
输出

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3

在此处使用
map
将旧值映射到新值。唯一的诀窍是您需要多个列。因此,我们必须在这里使用
apply

final = df1.set_index('ResponseID')\
           .apply(lambda x: x.map(df2.set_index('Old_Value')['New_Value']))\
           .reset_index()
输出

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3
使用:

使用:


1.如果只需要忽略第一列,则不需要
设置索引()。重置索引()
。2.在
lambda
函数内应用
set\u index()
也可能比在函数外应用成本稍高。我使用了
set\u index
,因此我不必使用
iloc
。如果<代码> ID>代码>列在中间的某个地方怎么办?其次,我不喜欢用
inplace=True
覆盖OP的数据帧,因为他可能想进一步使用它@广港1号。如果只需要忽略第一列,则不需要
设置索引()。重置索引()
。2.在
lambda
函数内应用
set\u index()
也可能比在函数外应用成本稍高。我使用了
set\u index
,因此我不必使用
iloc
。如果<代码> ID>代码>列在中间的某个地方怎么办?其次,我不喜欢用
inplace=True
覆盖OP的数据帧,因为他可能想进一步使用它@广港