我正在尝试使用来自两个不同数据帧的数据进行条件合并 到我的原始数据框。
使用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是数据帧的一部分。
答案 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