Итерация по df для сравнения значений - PullRequest
2 голосов
/ 09 мая 2019

У меня большой фрейм данных, и мне нужно сравнить первую запись в первом столбце с первой записью во втором столбце. Затем от первой записи в первом столбце до первой записи в третьем столбце и т. Д. В основном я хочу посмотреть, если два значения> 0, а затем сделать что-то. Есть ли способ сделать это с помощью pandas dataframe?

0  22 0 44 5 6
1  12 3 56 0 0
2  0  0 1  0 0
3  1  2 0  0 0

Так что я хочу посмотреть, если 22 и 0 оба> 0. Тогда, если 22 и 44 оба> 0. Тогда, если 22 и 5 оба> 0. Тогда, если 22 и 6 оба> 0. Тогда, если 12 и 3 оба> 0. Тогда, если 12 и 56 оба> 0. ...и так далее. Если пара имеет оба элемента> 0, тогда мой код сделает что-то еще.

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

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Используйте DataFrame.rolling на ось = 1 - столбцы, сопоставьте по условию и проверьте, если хотя бы один True в обоих значениях any, или при необходимости проверьте, если оба значения True, используйте изменениеany до all.

Первый столбец заполнен NaN с, поэтому (я надеюсь) необходимо DataFrame.shift для последнего столбца NaN с, замените их наDataFrame.fillna и приведение к boolean:

print (df)
    a  b   c  d  e
0  22  0  44  5  6
1  12  3  56  0  0
2   0  0   1  0  0
3   1  2   0  0  0


def f(x):
    print (x)
    mask = x > 0
    print (mask)
    return mask.any()


df = df.rolling(2, axis=1).apply(f, raw=True).shift(-1, axis=1).fillna(0).astype(bool)
print (df)
       a     b      c      d      e
0   True  True   True   True  False
1   True  True   True  False  False
2  False  True   True  False  False
3   True  True  False  False  False
0 голосов
/ 09 мая 2019

посмотрите на это предложение, оно может работать для вас.

import pandas as pd
data = [[22, 0, 44, 5, 6], [12, 3, 56, 0, 0], [0, 0, 1, 0, 0], [1, 2, 0, 0, 0]]
df = pd.DataFrame(data)

# we ignore the first column since we will use it to compare
columns = df.columns[1:]

# new dataframe for convenience purposes
new_df = df.copy(deep=True)

# iterate through each column and compare the 1st and the iterating column and if both above zero make True or False
for i in columns:
    new_df.iloc[:, i] = (df.iloc[:, 0] > 0) & (new_df.iloc[:, i] > 0)

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