有条件合并:大熊猫

时间:2019-07-25 10:04:37

标签: python pandas dataframe

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

使用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

我想合并percent_e或percent_n,具体取决于Deal_type是新的还是扩展到推送计数得分。该数据框的长度为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是数据帧的一部分。

1 个答案:

答案 0 :(得分:0)

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

例如,由于df2的第一行的push_count等于0,并且mini_n数据帧中e_push_count列的值是全零或正整数。

在这些情况下,您需要选择要做什么,这是只有您可以决定的事情。

一种可能是将条件从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