【问题标题】:Assigning value in a column based on values on many other columns in dataframe根据数据框中许多其他列的值在列中分配值
【发布时间】:2020-03-11 13:17:32
【问题描述】:

我有一个包含 5 列的数据框,我想根据其他 4 列更新一列,数据框看起来像这样

from       via      to       x       y 
 3          2       13      in       out
 3          2       15      in       out
 3          2       21      in       out
13          2       3             
15          2       13     
21          2       13
1          12        2 
1          12        2
1          12        22
2          12        1      in
2          12        22     in      out
22         12        2    

这个想法是根据其他四列的值填充 X 列,顺序应该是这样的: 我必须检查 x 和 y 是否有值,如果是,那么我必须使用 (from ,via) 的相应值,并将所有行中的值与 (to, via) 的值进行比较,如果它们相同,所以我必须将对应于 (from, via) 的 Y 的值分配给具有 (to, via) 相等值的行的 X 列 所以在这个例子中,我可以看到 (from=3, Via=2 有 x 和 y 值,所以我将取 (from=3, Via=2) 的值并将其与 (to, via ) 在所有行中,然后我可以在具有 (to=3, via=10) 的行上分配 (y=out) 的值

最终的结果应该是这样的:

from       via      to       x       y 
 3          2       13      in       out
 3          2       15      in       out
 3          2       21      in      
13          2       3       out      
15          2       13      out
21          2       13
1          12        2      out 
1          12        2      out
1          12        22     out
2          12        1      in
2          12        22     in      out
22         12        2      out

如何在 pandas 数据框中做到这一点?

【问题讨论】:

  • 您应该输入一些设置数据框的代码。如果您不知道如何编写代码,即使是算法的伪代码也会有所帮助。您可能会在 stackoverflow.com/questions/16476924/… 阅读有关迭代数据框中的行的信息
  • 我不确定我是否理解您的问题。您提到的示例还谈到了from=3,Via=10,但是没有via=10 的行。正如@DavidGaertner 提到的,您可以发布算法或以更好的方式编写逻辑吗?
  • @davidbilla 不好意思,我写错了,应该是via=2,我现在编辑了,我觉得会更清楚

标签: python pandas dataframe multiple-columns


【解决方案1】:

我找不到完全相同的结果,但我使用了描述的算法:

# identify the lines where a change will occur and store the index and the new  value
tmp = df.assign(origix=df.index).merge(df[~df['x'].isna() & ~df['y'].isna()], 
                                       left_on = ['from', 'via'], right_on = ['to', 'via'],
                                       suffixes=('_x', '')).set_index('origix')

# apply changes in dataframe:
df.loc[tmp.index, 'x'] = tmp['y']

它给出:

【讨论】:

  • 谢谢 Serge,它工作了,但它给了我一个使用原始索引索引的对象的结果,这个对象包含我需要的值,但是你知道如何将这些值插入到X?
  • df.loc[tmp.index, 'x'] = tmp['y'] 应该到它。在我的测试中确实如此......
猜你喜欢
  • 2019-12-16
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多