我有一个这样的数据框:(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
所有这些数字应为正。
答案 0 :(得分:0)
据我所知,您需要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)
答案 1 :(得分:0)
如果我理解正确,则您的数据帧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。
请注意,我从数组中删除了省略号,这意味着我将它们的长度设置为相同。