Создание матрицы 0 и 1, которая сохраняет свою форму - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать матрицу из 1, если каждое значение 2-го столбца больше, чем значение предыдущего столбца, и 0, если меньше, когда я использую np. Где он просто выравнивает его. Я хочу сохранить первый и последний столбеци это форма.

df = pd.DataFrame(np.random.randn(8, 4),columns=['A', 'B', 'C', 'D'])

newd=pd.DataFrame()
for x in df.columns[1::2]:
        if bool(df.iloc[:,df.columns.get_loc(x)] <= 
df.iloc[:,df.columns.get_loc(x)-1]):
            newdf.append(1)
        else:newdf.append(0)

1 Ответ

0 голосов
/ 28 декабря 2018

Этот вопрос был немного расплывчатым, но я отвечу на вопрос, который, как мне кажется, лежит в основе того, что вы спрашиваете:

Допустим, вы начинаете с матрицы:

df1 = pd.DataFrame(np.random.randn(8, 4),columns=['A', 'B', 'C', 'D'])

Что создает:

          A         B         C         D
0  2.464130  0.796172 -1.406528  0.332499
1 -0.370764 -0.185119 -0.514149  0.158218
2 -2.164707  0.888354  0.214550  1.334445
3  2.019189  0.910855  0.582508 -0.861778
4  1.574337 -1.063037  0.771726 -0.196721
5  1.091648  0.407703  0.406509 -1.052855
6 -1.587963 -1.730850  0.168353 -0.899848
7  0.225723  0.042629  2.152307 -1.086585

Теперь вы можете использовать pd.df.shift(), чтобы сместить всю матрицу, а затем проверить получившиеся столбцы элемент за элементом за один шаг.Например:

df1.shift(1)

Создает:

          A         B         C         D
0 -0.370764 -0.185119 -0.514149  0.158218
1 -2.164707  0.888354  0.214550  1.334445
2  2.019189  0.910855  0.582508 -0.861778
3  1.574337 -1.063037  0.771726 -0.196721
4  1.091648  0.407703  0.406509 -1.052855
5 -1.587963 -1.730850  0.168353 -0.899848
6  0.225723  0.042629  2.152307 -1.086585
7       NaN       NaN       NaN       NaN

И теперь вы можете проверить получившиеся столбцы с новой матрицей следующим образом:

df2 = df1.shift(-1) > df1

, которая возвращает:

       A      B      C      D
0  False  False   True  False
1  False   True   True   True
2   True   True   True  False
3  False  False   True   True
4  False   True  False  False
5  False  False  False   True
6   True   True   True  False
7  False  False  False  False

Чтобы завершить ваш вопрос, мы конвертируем True / False в 1/0 следующим образом:

df2 = df2.applymap(lambda x: 1 if x == True else 0)

, который возвращает:

   A  B  C  D
0  0  0  1  0
1  0  1  1  1
2  1  1  1  0
3  0  0  1  1
4  0  1  0  0
5  0  0  0  1
6  1  1  1  0
7  0  0  0  0

В одномстрока:

df2 = (df1.shift(-1)>df1).replace({True:1,False:0})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...