зацикливание каждой строки кадра данных панд - PullRequest
1 голос
/ 23 мая 2019

У меня большой фрейм данных, и я хочу разделить значения одной и той же строки друг на друга, если выполняется определенное условие, и создать новый столбец для каждого условия.

Я перепробовал все виды циклов, но я получаю ошибку, что истинное значение ряда неоднозначно. Я думаю, что я близок к решению, но я не могу найти самый быстрый способ.

df = pd.DataFrame({'colA': np.random.randn(20), 'colB': np.random.randn(20), 'colC': np.random.randn(20)})
print(df)
x = 0
y = 0.5
for ix, r in df.iterrows():
    if (r['colA'] > x) & (r['colA'] < y):    
        df.loc[ix,str(y)] = df.loc[ix,'colA']/df.loc[ix,'colB']
        x += 0.5
        y += 0.5

Вот как далеко я сейчас добрался. Проблема в том, что x и y увеличиваются после каждой строки, для которой выполняется условие. Но мне нужно, чтобы деление было выполнено для ВСЕХ строк, где выполняется условие, и ТО увеличьте x и y.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Вы не должны использовать iterrows, если хотите, чтобы деление применялось ко всем линиям, удовлетворяющим условию.Вот исправленная версия вашего исходного кода:

while x <= df['colA'].max():
    sub = df.loc[(df['colA'] > x)&(df['colA'] < y)]  # filter the dataframe on both conditions
    df.loc[sub.index, str(y)] = df['colA']/df['colB']
    x += .5
    y += .5
0 голосов
/ 23 мая 2019

Два условия цикла while должны быть заключены в all() (или соответствующую функцию pandas), чтобы явно проверить, являются ли все значения полученного логического массива истинными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...