条件合并:单个索引器越界“在零处发生”错误

2024-05-16 03:31:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用来自两个不同数据帧的数据进行条件合并 我的原始数据帧。你知道吗

使用iloc选择用于条件查找的两个数据帧的数据。一个数据帧用于新建,一个用于扩展。你知道吗

n_push_count= push_count_mapping.iloc[:,0:4] 
e_push_count = push_count_mapping.iloc[:,-4:9]

        type_n  aging_n mini_n  percent_n
0       New     0       0       0.520833
1       New     1       1       0.318471
2       New     2       2       0.234848
3       New     3       3       0.156627
4       New     4       4       0.129032
5       New     >5      5       0.129630
6       New     5       4       4.500000
7       New     6       5       4.500000
8       New     4       5       4.400000

    type_e      aging_e mini_e  percent_e
0   Expansion   0       0       0.642722
1   Expansion   1       1       0.413793
2   Expansion   2       2       0.260204
3   Expansion   3       3       0.196721
4   Expansion   4       4       0.215385
5   Expansion   >5      5       0.156627
6   Expansion   4       4       66.000000
7   Expansion   >5      5       3.000000
8   Expansion   >5      5       4.000000

我想合并百分比或百分比,这取决于交易类型是新的还是扩展到推送计数分数。这个数据帧的长度是40条记录。0-39 这是df2

    deal_type    push_count    push_count_score
0   Expansion      0            NaN
1   Expansion      3            NaN
2   New            2            NaN
3   Expansion      0            NaN

我下面的函数适用于一组具有相同数据长度的类似列。这是完整的代码

from IPython.display import display, HTML
import pandas as pd
import csv
import json
import numpy as np

n_push_count= push_count_mapping.iloc[:,0:4] 
e_push_count = push_count_mapping.iloc[:,-4:9]

    def add_push_count(row):
        if row['deal_type'] == 'New':
            return n_push_count.loc[n_push_count['mini_n'] < row['push_count']].iloc[-1]['percent_n']
        elif row['deal_type'] == 'Expansion':
            return e_push_count.loc[e_push_count['mini_e'] < row['push_count']].iloc[-1]['percent_e']

    df2['push_count_score'] = df2.apply(add_push_count, axis=1)


    display(df)

我运行函数时收到一个错误

 IndexError: ('single positional indexer is out-of-bounds', 'occurred at index 0')

有人能帮忙解释一下这个错误是什么吗?在我的代码中,这个函数适用于一个非常类似的应用程序,但它甚至不适用于我正在处理的一部分数据。df2是数据帧的一部分。你知道吗


Tags: 数据importnewtypecountnanpushmapping
1条回答
网友
1楼 · 发布于 2024-05-16 03:31:59

发生此错误的原因是在某些情况下n_push_count.loc[n_push_count['mini_n'] < row['push_count']](或另一个带有e_)返回空数据帧。用.iloc[-1]索引空数据帧会引发IndexError。你知道吗

例如,这是因为df2的第一行push_count等于0,并且e_push_count数据帧中mini_n列的值都是零或正整数。你知道吗

在这种情况下,你需要选择做什么,这是一件只有你才能决定的事情。你知道吗

一种可能性是将条件从lesser更改为lesser or equal:使用<=而不是<。你知道吗

在本例中,使用您的数据示例,您将得到:

   deal_type  push_count  push_count_score
0  Expansion           0          0.642722
1  Expansion           3          0.196721
2        New           2          0.234848
3  Expansion           0          0.642722

但是,如果您要求n_push_count['mini_n']应该严格小于row['push_count'],那么您就没有该值的字段,必须修改代码以保持空值。为此,可以将函数的代码包装在try except块中:

def add_push_count(row):
    try:
        if row['deal_type'] == 'New':
            return n_push_count.loc[n_push_count['mini_n'] < row['push_count']].iloc[-1]['percent_n']
        elif row['deal_type'] == 'Expansion':
            return e_push_count.loc[e_push_count['mini_e'] < row['push_count']].iloc[-1]['percent_e']
    except IndexError:
        return np.NaN

您的df2将是:

   deal_type  push_count  push_count_score
0  Expansion           0               NaN
1  Expansion           3          0.260204
2        New           2          0.318471
3  Expansion           0               NaN

相关问题 更多 >