熊猫:每次迭代都按两列进行迭代

时间:2019-07-15 11:48:53

标签: python pandas

有人知道如何在每次迭代中迭代具有两列的pandas Dataframe吗?

说我有

   a            b             c            d
 5.1          3.5           1.4          0.2
 4.9          3.0           1.4          0.2
 4.7          3.2           1.3          0.2
 4.6          3.1           1.5          0.2
 5.0          3.6           1.4          0.2
 5.4          3.9           1.7          0.4

类似

for x, y in ...:
    correlation of x and y

所以输出将是

corr_ab     corr_bc     corr_cd
    0.1         0.3         -0.4 

2 个答案:

答案 0 :(得分:2)

您可以将zip用于元组的索引,使用Series.corrf-string作为列名创建一个元素列表的字典,然后传递给DataFrame构造函数:

L = {f'corr_{col1}{col2}': [df[col1].corr(df[col2])] 
                        for col1, col2 in zip(df.columns, df.columns[1:])}

df = pd.DataFrame(L)
print (df)
    corr_ab  corr_bc   corr_cd
0  0.860108  0.61333  0.888523

答案 1 :(得分:0)

您可以使用df.corr获取数据框的相关性。然后,您使用mask避免重复相关。之后,您可以堆叠新的数据框以使其更具可读性。假设您有这样的数据

    0   1   2   3   4
0  11   6  17   2   3
1   3  12  16  17   5
2  13   2  11  10   0
3   8  12  13  18   3
4   4   3   1   0  18

找到相关性, corrData = data.corr(method='pearson')

我们得到

      0         1         2         3         4
0  1.000000 -0.446023  0.304108 -0.136610 -0.674082
1 -0.446023  1.000000  0.563112  0.773013 -0.258801
2  0.304108  0.563112  1.000000  0.494512 -0.823883
3 -0.136610  0.773013  0.494512  1.000000 -0.545530
4 -0.674082 -0.258801 -0.823883 -0.545530  1.000000

提出重复的相关性, dataCorr = dataCorr.mask(np.tril(np.ones(dataCorr.shape)).astype(np.bool))

我们得到

   0         1         2         3         4
0 NaN -0.446023  0.304108 -0.136610 -0.674082
1 NaN       NaN  0.563112  0.773013 -0.258801
2 NaN       NaN       NaN  0.494512 -0.823883
3 NaN       NaN       NaN       NaN -0.545530
4 NaN       NaN       NaN       NaN       NaN

堆叠相关数据 dataCorr = dataCorr.stack().reset_index()

堆积的数据将如图所示

     level_0  level_1      0
0        0        1 -0.446023
1        0        2  0.304108
2        0        3 -0.136610
3        0        4 -0.674082
4        1        2  0.563112
5        1        3  0.773013
6        1        4 -0.258801
7        2        3  0.494512
8        2        4 -0.823883
9        3        4 -0.545530