创建一个维持其形状的0和1矩阵

时间:2018-12-27 20:50:43

标签: python pandas numpy dataframe

当我使用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 :(得分:1)

这个问题有点模糊,但是我会回答一个我认为是您所问问题的核心的问题:

假设您从矩阵开始:

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})