Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 熊猫:检查同一id在数据集中是否具有相同的值_Python_Pandas - Fatal编程技术网

Python 熊猫:检查同一id在数据集中是否具有相同的值

Python 熊猫:检查同一id在数据集中是否具有相同的值,python,pandas,Python,Pandas,我有这样一个数据集: customer_id customer_name order_id 1 0000A1 CompanyA 7e2e3978 2 0000A1 CompanyA 7e2e3de2 3 0000A1 CompanyA 7e2e3efa 4 0000B1 CompanyB 7e2e3fc2 5 0000B1 CompanyA 7e2e408a 6 0000B1 Co

我有这样一个数据集:

  customer_id customer_name order_id
1 0000A1       CompanyA     7e2e3978
2 0000A1       CompanyA     7e2e3de2
3 0000A1       CompanyA     7e2e3efa
4 0000B1       CompanyB     7e2e3fc2
5 0000B1       CompanyA     7e2e408a
6 0000B1       CompanyB     7e2e4148
7 0000C1       CompanC      7e2e4206
8 0000C1       CompanyC     7e2e42c4
9 0000C1       CompanyC     7e2e4512
数据集使用customer_id进行排序。有许多id(customer_id)和值(customer_name)应该彼此对应(相同的id应该具有相同的值)。但有些行的数据不正确(本例中为第5行和第7行)。我想用熊猫来找出这些行

现在,我正在使用一些if-else循环编写代码:

xlsx = pandas.ExcelFile('order-table.xlsx')
df = pandas.read_excel(xlsx, 'Sheet1')
previous_id = "0000A1"
previous_value = "CompanyA"
for (idx, row) in df.iterrows():
    current_id = row.loc['customer_id']
    current_value = row.loc['customer_name']
    if current_id == previous_id:
        if current_value == previous_value:
            df.loc[idx, "same"] = "true"
        else:
            df.loc[idx, "same"] = "false"
    else:
        previous_id = current_id
        previous_value = current_value

df.to_excel("order-table-marked.xlsx")

这可能会生成一列,该列可以标记出数据不正确的行。但我认为这不是最好的方法。在熊猫身上有更好的方法吗?使用groupby()或drop\u duplicate()进行此操作是否更快?如何进行此操作?

这是一个难题,因为您必须确定哪个客户名称是正确的,哪些是错误的。您尝试解决方案时假设第一个实例是正确的,但这并不一定总是正确的

最好的方法是建立一个直接将客户id映射到客户名称的字典,这样就可以很容易地回填和/或检查哪些答案是正确的。但是手动构建字典可能非常困难和/或耗时

解决这个问题的一种方法是假设对于每个客户id,最常出现的客户名称是正确的。在这种情况下,它应该如此简单:

df = pd.DataFrame({'customer_id': ['0000A1', '0000A1', '0000A1', '0000B1', '0000B1', '0000B1'],
              'customer_name': ['CompanyA', 'CompanyB', 'CompanyA', 'CompanB', 'CompanyB', 'CompanyB']})

for id in df['customer_id'].unique():
  correct_name = df[df['customer_id'] == id]['customer_name'].value_counts().idxmax()
  df.loc[df['customer_id'] == id, 'same'] = (df[df['customer_id'] == id]['customer_name'] == correct_name)

    customer_id customer_name   same
0   0000A1      CompanyA        True
1   0000A1      CompanyB        False
2   0000A1      CompanyA        True
3   0000B1      CompanB         False
4   0000B1      CompanyB        True
5   0000B1      CompanyB        True
这可能不会在100%的情况下都起作用,如果更频繁地使用错误的客户名称,或者使用的数量与正确的客户名称相同,那么我们无法通过编程确定使用哪一个是正确的(除非有一些总体规则,如长度或格式,您可以根据这些规则设置条件)


我希望这至少能为您提供一些可以使用的工具。

您的方法为每个客户的第一个元素生成一个NaN,然后我认为对于C中的其余元素,它将失败,因为它将尝试在应该是CompanyC时将所有其他元素与CompanyC进行比较?谢谢,这是可行的!然而,我在一个包含976260行数据的数据帧上运行这个程序,需要一个小时,但仍然没有完成。。。有没有更快的方法?我已经查看了dask,但它在df.loc[]方法中报告了这个错误