Вопрос: Извлечение / добавление строк данных pandas dataframe, которые удовлетворяют сложному условию, включающему несколько столбцов


У меня возникли проблемы с пониманием того, как работает цикл с помощью DataFrame.

Я где-то нашел, что если вы напишете:

for row in df.iterrows()

вы не сможете получить доступ к строке ['column1'], вместо этого вам придется использовать

for row,index in df.iterrows() и тогда это работает.

Теперь я хочу создать набор сигналов, которые я нашел в цикле, добавив строку в новую фреймворк данных newdf.append(row) это работает, но оно теряет способность ссылаться на строку. Как мне добавить эти строки в мой фреймворк, чтобы это сработало?

Детальный код:

dataframe1 = DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe2 = DataFrame()

for index,row in dataframe1:
   if row['a'] == 5
       dataframe2.append(row)

print dataframe2['b']

Это не работает, потому что он не принимает строки внутри скобки для dataframe2. Да, это можно сделать проще, но ради аргумента можно сказать, что это не может (более сложная логика, чем одна, если).

В моем реальном коде есть десять различных ifs и elses, определяющих, что делать с этой конкретной строкой (и делать другие вещи из цикла). Я не говорю о фильтрации, а просто добавляю строку в новый фреймворк так, чтобы он сохранял индекс, поэтому я могу ссылаться на имя столбца


4


источник


Ответы:


В pandas, довольно просто фильтровать и передавать результаты, если это необходимо, в новую фреймворк данных, так же, как @smci предлагает для r,

import numpy as np
import pandas as pd

dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe1.head()

          a         b         c         d         e
0 -2.824391 -0.143400 -0.936304  0.056744 -1.958325
1 -1.116849  0.010941 -1.146384  0.034521 -3.239772
2 -2.026315  0.600607  0.071682 -0.925031  0.575723
3  0.088351  0.912125  0.770396  1.148878  0.230025
4 -0.954288 -0.526195  0.811891  0.558740 -2.025363

Затем, чтобы фильтровать, вы можете сделать так:

dataframe2=dataframe1.ix[dataframe1.a>.5]
dataframe2.head()

         a         b         c         d         e
0  0.708511  0.282347  0.831361  0.331655 -2.328759
1  1.646602 -0.090472 -0.074580 -0.272876 -0.647686
8  2.728552 -0.481700  0.338771  0.848957 -0.118124

РЕДАКТИРОВАТЬ

OP не хотел использовать фильтр, так что вот пример, повторяющий через строки:

np.random.seed(123)
dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
## I declare the second df with the same structure
dataframe2 = pd.DataFrame(columns=['a','b','c', 'd', 'e'])

Для цикла я использую iterrows, а вместо appendиспользуя пустой блок данных, я использую индекс из итератора для размещения в той же позиции индекса в пустом кадре. Заметьте, что я сказал > .5 вместо = 5 или же результирующий фрейм данных будет пустым.

for index, row in dataframe1.iterrows():
    if row['a'] > .5:

        dataframe2.loc[index] =  row

dataframe2

          a         b         c         d         e
1  1.651437 -2.426679 -0.428913  1.265936 -0.866740
4  0.737369  1.490732 -0.935834  1.175829 -1.253881

2



ОБНОВИТЬ:

Не.  Решение:

dataframe1[dataframe1.a > .5]
# or, if you only want the 'b' column
dataframe1[dataframe1.a > .5] ['b']

Вы хотите только фильтровать строки, где == 5 (а затем выбрать столбец b)? Вы все еще указали нулевую причину, почему вам нужно добавить к dataframe1. На самом деле вам не нужно ничего добавлять, вы просто напрямую генерируете отфильтрованную версию.

ОРИГИНАЛЬНАЯ ВЕРСИЯ:

Не.

Если все, что вы хотите сделать, это вычислить агрегаты или сводки, и они действительно не принадлежат родительскому фреймворку данных, сделайте фильтр. Назначьте результат отдельному кадру данных.

Если вы действительно настаиваете на использовании iterate + append, вместо фильтра, даже зная все оговорки, затем создайте пустой сводный фрейм данных, а затем добавьте к нему при повторении. Только после того, как вы закончите итерацию, добавьте его (и только если вам действительно нужно), вернитесь к родительскому фреймворку.


0