Python遍历单列表多元素生成pandas 9*9相关系数矩阵问题求助
现有数据集
Zn Pb Ag Cu Mo Cr Ni Co Ba 87 7 0.02 42 2 57 38 14 393 70 6 0.02 56 2 27 29 20 404 75 5 0.02 69 2 44 23 17 417 70 6 0.02 54 1 20 19 12 377
原有代码
def correlation_iterated(raw_data,element_concentration): columns = element_concentration.split() df1 = pd.DataFrame(columns=columns) data1=[] selected_columns = raw_data.loc[:, element_concentration.split()].columns for i in selected_columns: for j in selected_columns: # another function that takes 'i' and 'j' and returns 'a' zipped1 = zip([i], a) data1.append(dict(zipped1)) df1 = df1.append(data1,True) print(df1)
问题说明
- 实际输出为81行9列,仅对应列有计算值,其余为NaN:
Zn Pb Ag Cu Mo Cr Ni Co Ba 0 1.000000 NaN NaN NaN NaN NaN NaN NaN NaN 1 0.460611 NaN NaN NaN NaN NaN NaN NaN NaN 2 0.127904 NaN NaN NaN NaN NaN NaN NaN NaN 3 0.276086 NaN NaN NaN NaN NaN NaN NaN NaN 4 -0.164873 NaN NaN NaN NaN NaN NaN NaN NaN .. ... .. .. .. .. .. .. .. ... 76 NaN NaN NaN NaN NaN NaN NaN NaN 0.113172 77 NaN NaN NaN NaN NaN NaN NaN NaN 0.027251 78 NaN NaN NaN NaN NaN NaN NaN NaN -0.036409 79 NaN NaN NaN NaN NaN NaN NaN NaN 0.041396 80 NaN NaN NaN NaN NaN NaN NaN NaN 1.000000 [81 rows x 9 columns]
- 预期输出为9行9列的结果矩阵:
Zn Pb Ag Cu Mo Cr Ni Co Ba 0 1.000000 0.460611 ... 1 0.460611 1.000000 ... 2 0.127904 0.111559 ... 3 0.276086 0.303925 ... 4 -0.164873 -0.190886 ... 5 0.402046 0.338073 ... 6 0.174774 0.096724 ... 7 0.165760 -0.005301 ... 8 -0.043695 0.174193 ... [9 rows x 9 columns]
修改后代码
原代码问题为循环逻辑错误:两层循环每次仅生成含单列值的字典,追加后自然得到81行多数值为NaN的结果。调整为按行攒整行计算值再生成DataFrame即可:
import pandas as pd def correlation_iterated(raw_data, element_concentration): columns = element_concentration.split() selected_columns = raw_data.loc[:, columns].columns result = [] # 外层循环遍历行 for i in selected_columns: row_data = [] # 内层循环遍历列,攒当前行所有列的计算值 for j in selected_columns: # 此处保留原有i、j计算逻辑得到a row_data.append(a) result.append(row_data) # 直接用二维列表生成9行9列DataFrame df1 = pd.DataFrame(result, columns=columns) print(df1) return df1
如果你的计算逻辑本身是求皮尔逊相关系数,可直接调用pandas内置方法,无需自行实现循环:
corr_df = raw_data[element_concentration.split()].corr()
内容的提问来源于stack exchange,提问作者SupernovifieD
相关产品推荐
相关产品推荐

