условный выбор строк и столбцов в пандах - PullRequest
0 голосов
/ 05 июля 2018

У меня есть такой фрейм данных: (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)

Я хочу вычислить свою массу в моем потоке, но ему нужно выбрать from_node, когда q_flowline положительна, и ему нужно выбрать to_node, когда q_flowline отрицательна.

Я пытался:

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

Все эти цифры должны быть положительными.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если я правильно понимаю, ваш фрейм данных 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 так, как вам нужно, в зависимости от того, какой индекс или последовательность требуется.

Обратите внимание, что я удалил elision из ваших массивов, то есть я заставил их иметь одинаковую длину.

0 голосов
/ 05 июля 2018

Из того, что я могу расшифровать, вам нужно 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...