【问题标题】:conditional row and column selection in pandas熊猫中的条件行和列选择
【发布时间】:2018-07-05 14:23:26
【问题描述】:

我有一个这样的数据框:(c_in_node)

0    
1791  0.1
1792  0.3
1793  0.2
1794  0.1
...
3611  0.1

还有一个像这样的数组:(q_flowline)

[0.1 0.2  -0.1 ... -0.3]

还有另外两个这样的数组:

[1907 2343 2344 ... 3604 1845 2179] (fl_from_node)
[2343 2344 2050 ... 1918 3600 3611] (fl_to_node)

我想计算我的流量中的质量,但是当 q_flowline 为正时它需要选择 from_node,当 q_flowline 为负时它需要选择 to_node。

我试过了:

m_in_flow = pd.DataFrame(c_in_node[fl_from_node if q_flowline >= 0 else fl_to_node]*q_flowline)

但这不起作用。我需要一个带有选择的 DataFrame:

0
0.01
0.03
....
0.01

所有这些数字都应该是正数。

【问题讨论】:

  • c_in_node 是从哪里进入你的逻辑的?它的列是什么?
  • c_in_node,是cartain节点的集中度。这是我展示的第一个数据框
  • 对不起,concentration at a cartain node 对我来说毫无意义。你能用更简单的术语描述你的逻辑吗?
  • 我需要流线中的质量,流线连接到两个节点,一个 from_node 和一个 to_node。如果流量(q_flowline)为正,我需要 from_node 中的浓度,但如果流量为负,我需要 to_node 中的浓度。

标签: python arrays pandas numpy dataframe


【解决方案1】:

据我所知,您需要 numpy.where 来构造一个向量化的 if / else 并将其作为索引器提供给 c_in_node.loc

idx = np.where(q_flowline >= 0, fl_from_node, fl_to_node)

m_in_flow = pd.DataFrame(c_in_node.loc[idx] * q_flowline)

【讨论】:

    【解决方案2】:

    如果我理解正确,您的数据框 c_in_node 与您的数组是不同的对象。这段代码:

    m_in_flow = pd.DataFrame(c_in_node[fl_from_node if q_flowline >= 0 else fl_to_node]*q_flowline)
    

    不会给你你想要的,因为条件语句不引用数据帧中的任何内容——使用[] 意味着你想使用可以在该数据帧本身中找到的信息对数据帧进行子集化。否则,它将不知道如何索引行。不过,我会说这是我从你的问题中假设的。看到实际错误不仅仅是说“这不起作用”。

    如果您的数组要对齐在一起(因此它们具有相同的长度),您可以执行以下操作:

    import numpy as np
    import pandas as pd
    q_flowline = np.array(0.1, 0.2, -0.1, -0.3)
    fl_from_node = (1907, 2343, 1845, 2179)
    fl_to_node = (2343, 2344, 2050, 3611)
    stacked_array = np.column_stack((q_flowline, fl_from_node, flow_to_node))
    stacked_df = pd.DataFrame(stacked_array, columns = ['q_flowline', 'fl_from_node', 'fl_to_node'])
    full_df = pd.concat([c_in_node, stacked_df], axis=1)
    pos_flowline_df = full_df['fl_from_node'][(full_df['q_flowline'] >= 0)]
    neg_flowline_df = full_df['fl_to_node'][(full_df['q_flowline'] < 0)]
    

    然后根据需要的任何索引或顺序组合新的 DF。

    请注意,我从您的数组中删除了省略号,这意味着我强制它们具有相同的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多