Python:复杂数组上的vlookup,搜索每行的多个列

时间:2017-04-14 17:18:33

标签: python arrays pandas if-statement

我有以下问题,我的python代码不起作用。希望得到一些关于为什么以及如何解决的建议。

以下是示例数据框:

cust_id max_nibt nibt_0 nibt_1  nibt_10 line_0  line_1  line_10
11  200 -5  200 500 100 200 300
22  300 -10 100 300 100 200 300
33  400 -20 0   400 100 200 300
for i in range (0,11):
    if (df4['nibt_%s' % i] == df4['max_nibt']): 
        df4['model_line'] = df4['line_%s' % i]

代码给出了以下错误:

  

ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()

但是,当我使用.any()时,它只会给我指定model_line = line_10的最后一个范围。当我使用.all()时,所有cust_ids的答案都是相同的。想法?提前谢谢。

3 个答案:

答案 0 :(得分:4)

我必须猜测你想要什么,但你显然没有正确使用def parse_entities(data): return ",".join([entity['name'] + ":" + entity['sentiment'] for entity_data in data.values() for entity in entity_data if not entity['sentiment'] == 'none']) ...请参阅here以获得更好的解释。

IIUC
您希望在pd.Series等于line_x

时填写nibt_x的值
max_nibt

答案 1 :(得分:2)

考虑将.loc用于行索引条件。按原样,你的for循环比较两列的所有值(即pandas Series)是否相等,因此任意数量的布尔结果:

for i in [0,1,10]:
  df4.loc[df4['nibt_%s' % i] == df4['max_nibt'], 'model_line'] = df4['line_%s' % i]

或者,由于此for循环可以覆盖相同的新列 model_line ,因此请考虑添加 model_line 的后缀版本:

for i in [0,1,10]:
  df4.loc[df4['nibt_%s' % i] == df4['max_nibt'], 'model_line_%s' % i] = df4['line_%s' % i]

答案 2 :(得分:1)

你不能比较那样的系列,因为大熊猫将如何知道你想要比较哪些元素?

如果我理解正确,你可以这样做:

for i in range(0,11):
  for j,k in df.iterrows():
    if k['nibt_%s' % i] == k['max_nibt']:
      df.iloc[j]['model_line'] = df.iloc[j]['line_%s' % i]