Python DataFrame.lookup需要具有最新版本的Pandas的唯一索引和列

Python DataFrame.lookup需要具有最新版本的Pandas的唯一索引和列,python,python-3.x,pandas,dataframe,lookup,Python,Python 3.x,Pandas,Dataframe,Lookup,我正在使用python3.7,最近版本的pandas出现了一个问题。 这是我的密码 import pandas as pd import numpy as np data = {'col_1':[9087.6000, 9135.8000, np.nan, 9102.1000], 'col_2':[0.1648, 0.1649, '', 5.3379], 'col_nan':[np.nan, np.nan, np.nan, np.nan], 'co

我正在使用python3.7,最近版本的pandas出现了一个问题。 这是我的密码

import pandas as pd
import numpy as np

data = {'col_1':[9087.6000, 9135.8000, np.nan, 9102.1000],
        'col_2':[0.1648, 0.1649, '', 5.3379],
        'col_nan':[np.nan, np.nan, np.nan, np.nan],
        'col_name':['col_nan', 'col_1', 'col_2', 'col_nan']
        }
df = pd.DataFrame(data, index=[101, 102, 102, 104])

col_lookup = 'results'
col_result = 'col_name'
df[col_lookup] = df.lookup(df.index, df[col_result])

该代码在pandas版本1.0.3中运行良好,但是 当我尝试使用1.1.1版时,出现以下错误:

“ValueError:DataFrame.lookup需要唯一的索引和列”

数据帧实际上包括索引“102”的副本

出于不同的原因,我必须使用pandas的1.1.1版。是否有使用“lookup”命令的解决方案来支持此版本的pandas的索引复制


提前感谢您的帮助。

放置唯一索引,然后恢复旧索引

import pandas as pd
import numpy as np

data = {'col_1':[9087.6000, 9135.8000, np.nan, 9102.1000],
        'col_2':[0.1648, 0.1649, '', 5.3379],
        'col_nan':[np.nan, np.nan, np.nan, np.nan],
        'col_name':['col_nan', 'col_1', 'col_2', 'col_nan']
        }
df = pd.DataFrame(data, index=[101, 102, 102, 104])

col_lookup = 'results'
col_result = 'col_name'
df.reset_index(inplace=True)
df[col_lookup] = df.lookup(df.index, df[col_result])
df = df.set_index(df["index"]).drop(columns="index")


放置唯一索引,然后还原旧索引

import pandas as pd
import numpy as np

data = {'col_1':[9087.6000, 9135.8000, np.nan, 9102.1000],
        'col_2':[0.1648, 0.1649, '', 5.3379],
        'col_nan':[np.nan, np.nan, np.nan, np.nan],
        'col_name':['col_nan', 'col_1', 'col_2', 'col_nan']
        }
df = pd.DataFrame(data, index=[101, 102, 102, 104])

col_lookup = 'results'
col_result = 'col_name'
df.reset_index(inplace=True)
df[col_lookup] = df.lookup(df.index, df[col_result])
df = df.set_index(df["index"]).drop(columns="index")


非唯一索引是一个bug:

pandas 1.1.1中的“查找”方法不允许将非唯一索引作为输入参数传递。 在“frame.py”中的“lookup”方法的开头添加了以下代码,对于我来说,该方法位于(第3836行):

C:\Users\Sajad\AppData\Local\Programs\Python\38\Lib\site packages\pandas\core\frame.py

if not (self.index.is_unique and self.columns.is_unique):
# GH#33041
    raise ValueError("DataFrame.lookup requires unique index and columns")
但是,如果此错误处理程序不存在,则此方法中的以下过程将以for循环结束。用这个内置的for循环替换最后一行可以得到与以前版本相同的结果

result = np.empty(len(df.index), dtype="O")
for i, (r, c) in enumerate(zip(df.index, df[col_result])):
    result[i] = df._get_value(r, c)
df[col_lookup] = result

非唯一索引是一个bug:

pandas 1.1.1中的“查找”方法不允许将非唯一索引作为输入参数传递。 在“frame.py”中的“lookup”方法的开头添加了以下代码,对于我来说,该方法位于(第3836行):

C:\Users\Sajad\AppData\Local\Programs\Python\38\Lib\site packages\pandas\core\frame.py

if not (self.index.is_unique and self.columns.is_unique):
# GH#33041
    raise ValueError("DataFrame.lookup requires unique index and columns")
但是,如果此错误处理程序不存在,则此方法中的以下过程将以for循环结束。用这个内置的for循环替换最后一行可以得到与以前版本相同的结果

result = np.empty(len(df.index), dtype="O")
for i, (r, c) in enumerate(zip(df.index, df[col_result])):
    result[i] = df._get_value(r, c)
df[col_lookup] = result

请发布您的预期输出请发布您的预期输出仅当您错过了它在旧pandas版本中的工作方式时-它会创建列表以匹配重复的索引值,因此无法使用此解决方案。@jezrael ok,但问题是如何使其在pandas 1.1中工作。若你们看问题,它不需要列表,第3行会在第2行查找一个不同的列。因此,一份清单是不可取的。IMHO这给出了正确的答案,查找只有在一个唯一的索引下才有意义——这是对熊猫的一个很好的升级。向后兼容不会造成任何问题sense@RobRaymond感谢您提供的此解决方案,它工作完美,在我看来是最理想的(无迭代)。只有您错过了它在旧版本中的工作方式-它创建列表以匹配重复的索引值,因此无法使用此解决方案。@jezrael ok,然而,问题是如何使它在熊猫1.1中工作。若你们看问题,它不需要列表,第3行会在第2行查找一个不同的列。因此,一份清单是不可取的。IMHO这给出了正确的答案,查找只有在一个唯一的索引下才有意义——这是对熊猫的一个很好的升级。向后兼容不会造成任何问题sense@RobRaymond感谢您提供了这个完美的解决方案,在我看来,它是最理想的(无需迭代)。感谢您对这个bug的起源进行了非常清晰的解释。您的解决方案工作得很好,但在处理有时有几百万行的数据集时,我想使用for循环的迭代并不是出于性能原因的最佳选择。是的。对于大型数据来说,for循环总是一个难题。顺便说一下,这就是“查找”对像您这样的混合类型数据所做的。因此,是否使用迭代器并不重要。但是,当所有数据都表示为numpy数组时,“查找”是最佳且快速的。感谢您对该错误来源的非常清楚的解释。您的解决方案工作得很好,但在处理有时有几百万行的数据集时,我想使用for循环的迭代并不是出于性能原因的最佳选择。是的。对于大型数据来说,for循环总是一个难题。顺便说一下,这就是“查找”对像您这样的混合类型数据所做的。因此,是否使用迭代器并不重要。然而,当所有数据都表示为numpy数组时,“查找”是最佳且快速的。