Python 如何从循环中的df.corr()中提取单个值

Python 如何从循环中的df.corr()中提取单个值,python,pandas,dataframe,matrix,correlation,Python,Pandas,Dataframe,Matrix,Correlation,我有一个dataframe,它有两级列,如下所示: 我想确定每个国家的案例和比率之间的相关性——不包括值为0的所有行(无论是案例还是比率),因为这些都是异常值,不相关 我有一个循环,在其中运行country_df.corr(),可以看到我想要什么。如果我能抓住我想要的特定值,那么我可能会将其存储在一个带有国家名称的列表中——这就是我想要做的。我只是不知道如何从相关矩阵中提取特定值 然后,我将从列表中选择那些值大于0.5或可能小于-0.5的条目。这种关系预计是相反的——随着疫苗接种率的上升,我们

我有一个dataframe,它有两级列,如下所示:

我想确定每个国家的案例和比率之间的相关性——不包括值为0的所有行(无论是案例还是比率),因为这些都是异常值,不相关

我有一个循环,在其中运行country_df.corr(),可以看到我想要什么。如果我能抓住我想要的特定值,那么我可能会将其存储在一个带有国家名称的列表中——这就是我想要做的。我只是不知道如何从相关矩阵中提取特定值

然后,我将从列表中选择那些值大于0.5或可能小于-0.5的条目。这种关系预计是相反的——随着疫苗接种率的上升,我们预计麻疹病例会下降

以下是循环代码:

df=df2.unstack().fillna(0)
for country in df.columns.get_level_values(0).unique():
    country_df = df[[c for c in df.columns if c[0] == country]]
    for c in [c for c in country_df.columns if c[1] in ['Cases', 'Rate']]:
        country_df = country_df[country_df[c] > 0]
    print country_df.corr()  # Instead of printing whole correlation here I just want to store the country name & cases/rate correlation
非常感谢您的帮助

以下是创建此数据帧的代码:

df2 = pd.DataFrame({u'Afghanistan': {(2000L, 'Cases'): 6532.0,
  (2000L, 'Pop'): 19702000.0,
  (2000L, 'Rate'): 27.0,
  (2001L, 'Cases'): 8762.0,
  (2001L, 'Pop'): 20641600.0,
  (2001L, 'Rate'): 37.0,
  (2002L, 'Cases'): 2486.0,
  (2002L, 'Pop'): 21581200.0,
  (2002L, 'Rate'): 35.0,
  (2003L, 'Cases'): 798.0,
  (2003L, 'Pop'): 22520800.0,
  (2003L, 'Rate'): 39.0,
  (2004L, 'Cases'): 466.0,
  (2004L, 'Pop'): 23460400.0,
  (2004L, 'Rate'): 48.0,
  (2005L, 'Cases'): 1296.0,
  (2005L, 'Pop'): 24400000.0,
  (2005L, 'Rate'): 50.0},
 u'Albania': {(2000L, 'Cases'): 662.0,
  (2000L, 'Pop'): 3122000.0,
  (2000L, 'Rate'): 95.0,
  (2001L, 'Cases'): 18.0,
  (2001L, 'Pop'): 3114000.0,
  (2001L, 'Rate'): 95.0,
  (2002L, 'Cases'): 16.0,
  (2002L, 'Pop'): 3106000.0,
  (2002L, 'Rate'): 96.0,
  (2003L, 'Cases'): 8.0,
  (2003L, 'Pop'): 3098000.0,
  (2003L, 'Rate'): 93.0,
  (2004L, 'Cases'): 7.0,
  (2004L, 'Pop'): 3090000.0,
  (2004L, 'Rate'): 96.0,
  (2005L, 'Cases'): 6.0,
  (2005L, 'Pop'): 3082000.0,
  (2005L, 'Rate'): 97.0},
 u'Algeria': {(2000L, 'Cases'): 0.0,
  (2000L, 'Pop'): 31184000.0,
  (2000L, 'Rate'): 80.0,
  (2001L, 'Cases'): 2686.0,
  (2001L, 'Pop'): 31600800.0,
  (2001L, 'Rate'): 83.0,
  (2002L, 'Cases'): 5862.0,
  (2002L, 'Pop'): 32017600.0,
  (2002L, 'Rate'): 81.0,
  (2003L, 'Cases'): 15374.0,
  (2003L, 'Pop'): 32434400.0,
  (2003L, 'Rate'): 84.0,
  (2004L, 'Cases'): 3289.0,
  (2004L, 'Pop'): 32851200.0,
  (2004L, 'Rate'): 81.0,
  (2005L, 'Cases'): 2302.0,
  (2005L, 'Pop'): 33268000.0,
  (2005L, 'Rate'): 83.0},
 u'Andorra': {(2000L, 'Cases'): 2.0,
  (2000L, 'Pop'): 65000.0,
  (2000L, 'Rate'): 97.0,
  (2001L, 'Cases'): 5.0,
  (2001L, 'Pop'): 68200.0,
  (2001L, 'Rate'): 97.0,
  (2002L, 'Cases'): 1.0,
  (2002L, 'Pop'): 71400.0,
  (2002L, 'Rate'): 98.0,
  (2003L, 'Cases'): 0.0,
  (2003L, 'Pop'): 74600.0,
  (2003L, 'Rate'): 96.0,
  (2004L, 'Cases'): 0.0,
  (2004L, 'Pop'): 77800.0,
  (2004L, 'Rate'): 98.0,
  (2005L, 'Cases'): 0.0,
  (2005L, 'Pop'): 81000.0,
  (2005L, 'Rate'): 94.0},
 u'Angola': {(2000L, 'Cases'): 2219.0,
  (2000L, 'Pop'): 15059000.0,
  (2000L, 'Rate'): 36.0,
  (2001L, 'Cases'): 9046.0,
  (2001L, 'Pop'): 15629800.0,
  (2001L, 'Rate'): 65.0,
  (2002L, 'Cases'): 11945.0,
  (2002L, 'Pop'): 16200600.0,
  (2002L, 'Rate'): 66.0,
  (2003L, 'Cases'): 1196.0,
  (2003L, 'Pop'): 16771400.0,
  (2003L, 'Rate'): 52.0,
  (2004L, 'Cases'): 29.0,
  (2004L, 'Pop'): 17342200.0,
  (2004L, 'Rate'): 52.0,
  (2005L, 'Cases'): 258.0,
  (2005L, 'Pop'): 17913000.0,
  (2005L, 'Rate'): 32.0}})

对于你给出的数据,相关矩阵的顺序总是一样的,所以看起来

                Angola                    
                 Cases       Pop      Rate
Angola Cases  1.000000 -0.500364  0.779077
       Pop   -0.500364  1.000000 -0.274885
       Rate   0.779077 -0.274885  1.000000
因此,您只需使用
.iloc()
选择所需的值,只需在循环之前创建一个字典(或列表或任何您想要的内容),并将国家和值附加到正确的位置即可

corr_dict = {}
df=df2.unstack().fillna(0)
for country in df.columns.get_level_values(0).unique():
    country_df = df[[c for c in df.columns if c[0] == country]]
    for c in [c for c in country_df.columns if c[1] in ['Cases', 'Rate']]:
        country_df = country_df[country_df[c] > 0]
    corr_dict[country] = country_df.corr().iloc[0,2]

corr_dict
#{'Afghanistan': -0.6404117984998553,
# 'Albania': -0.12115398350489878,
# 'Algeria': 0.5031318694416725,
# 'Andorra': -0.6933752452815364,
# 'Angola': 0.779077493398456}

对于你给出的数据,相关矩阵的顺序总是一样的,所以看起来

                Angola                    
                 Cases       Pop      Rate
Angola Cases  1.000000 -0.500364  0.779077
       Pop   -0.500364  1.000000 -0.274885
       Rate   0.779077 -0.274885  1.000000
因此,您只需使用
.iloc()
选择所需的值,只需在循环之前创建一个字典(或列表或任何您想要的内容),并将国家和值附加到正确的位置即可

corr_dict = {}
df=df2.unstack().fillna(0)
for country in df.columns.get_level_values(0).unique():
    country_df = df[[c for c in df.columns if c[0] == country]]
    for c in [c for c in country_df.columns if c[1] in ['Cases', 'Rate']]:
        country_df = country_df[country_df[c] > 0]
    corr_dict[country] = country_df.corr().iloc[0,2]

corr_dict
#{'Afghanistan': -0.6404117984998553,
# 'Albania': -0.12115398350489878,
# 'Algeria': 0.5031318694416725,
# 'Andorra': -0.6933752452815364,
# 'Angola': 0.779077493398456}

太棒了非常好用,谢谢你,我的数据争论知识库又增加了一个概念。我用你首先提到的列表测试了它,但我当然明白为什么作为一个dict做得更好。是的,这取决于你想用它做什么。您甚至可以将其制作成一个
数据框架
,这样就可以轻松地继续使用所有pandas方法
corrdf=df.from_dict({'corr':corr_dict})
非常有趣-这正是我所做的-但我用了一种稍微少一些的pythonis方式:correlation=pd.DataFrame(corr_dict,index=['correlation'])它工作了-但我需要转置它。您的评论甚至为我提供了更多关于数据争论知识库的数据-我建议这是答案中有价值的一部分,您可能希望将其添加进来?太棒了非常好用,谢谢你,我的数据争论知识库又增加了一个概念。我用你首先提到的列表测试了它,但我当然明白为什么作为一个dict做得更好。是的,这取决于你想用它做什么。您甚至可以将其制作成一个
数据框架
,这样就可以轻松地继续使用所有pandas方法
corrdf=df.from_dict({'corr':corr_dict})
非常有趣-这正是我所做的-但我用了一种稍微少一些的pythonis方式:correlation=pd.DataFrame(corr_dict,index=['correlation'])它工作了-但我需要转置它。你的评论甚至为我提供了更多关于数据争论知识库的数据——我认为这是答案中有价值的一部分,你可能想把它加进去?