【问题标题】:pandas.DataFrame corrwith() methodpandas.DataFrame corrwith() 方法
【发布时间】:2016-11-20 04:36:53
【问题描述】:

我最近开始使用pandas。谁能解释一下.corrwith()SeriesDataFrame在函数行为上的区别?

假设我有一个DataFrame:

frame = pd.DataFrame(data={'a':[1,2,3], 'b':[-1,-2,-3], 'c':[10, -10, 10]})

我想计算特征“a”和所有其他特征之间的相关性。 我可以通过以下方式做到这一点:

frame.drop(labels='a', axis=1).corrwith(frame['a'])

结果将是:

b   -1.0
c    0.0

但非常相似的代码:

frame.drop(labels='a', axis=1).corrwith(frame[['a']])

生成完全不同且不可接受的表:

a   NaN
b   NaN
c   NaN

所以,我的问题是:为什么在 DataFrame 作为第二个参数的情况下,我们会得到如此奇怪的输出?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    corrwith 定义为DataFrame.corrwith(other, axis=0, drop=False),因此默认情况下axis=0 - 即Compute pairwise correlation between columns of two **DataFrame** objects

    所以两个 DF 中的列名/标签必须相同:

    In [134]: frame.drop(labels='a', axis=1).corrwith(frame[['a']].rename(columns={'a':'b'}))
    Out[134]:
    b   -1.0
    c    NaN
    dtype: float64
    

    NaN- 表示(在这种情况下)没有什么可比较/关联的,因为在other DF 中没有名为c 的列

    如果您将系列传递为other,它将被翻译(来自link,您在comment 中发布)为:

    In [142]: frame.drop(labels='a', axis=1).apply(frame.a.corr)
    Out[142]:
    b   -1.0
    c    0.0
    dtype: float64
    

    【讨论】:

    • 在文档中 - 是的。但在 GitHub 上的代码中存在 Series 的特殊情况:github.com/pydata/pandas/blob/…。问题仍然存在:为什么在DataFrame 的情况下我们会得到这样的输出?我认为 .corrwith() 必须计算来自自己和其他框架列的所有对之间的相关性。但在示例结果中始终是 Nan。
    • @NikitaSivukhin,我已经更新了我的答案 - 请检查
    【解决方案2】:

    我认为你在寻找什么:

    假设你的框架是:

    frame = pd.DataFrame(np.random.rand(10, 6), columns=['cost', 'amount', 'day', 'month', 'is_sale', 'hour'])
    

    您希望'cost''amount' 列与每个组合中的所有其他列相关。

    focus_cols = ['cost', 'amount']
    frame.corr().filter(focus_cols).drop(focus_cols)
    

    回答你的问题:

    成对计算 两个 DataFrame 对象的行或列之间的相关性。

    参数:

    其他:数据帧

    轴:{0 或“索引”,1 或“列”},

    默认 0 0 或“索引”来计算列,1 或“列”用于逐行删除:布尔值,默认 False 删除缺少的索引 结果,默认返回所有返回的并集:correls : Series

    corrwith 的行为类似于addsubmuldiv,因为它希望找到DataFrameSeries 被传递到other,尽管文档说只是DataFrame

    otherSeries 时,它会广播该系列并沿axis 指定的轴匹配,默认值为0。这就是以下工作的原因:

    frame.drop(labels='a', axis=1).corrwith(frame.a)
    
    b   -1.0
    c    0.0
    dtype: float64
    

    otherDataFrame 时,它将匹配axis 指定的轴并关联由另一个轴标识的每一对。如果我们这样做了:

    frame.drop('a', axis=1).corrwith(frame.drop('b', axis=1))
    
    a    NaN
    b    NaN
    c    1.0
    dtype: float64
    

    只有c 是共同的,并且只有c 计算了它的相关性。

    在您指定的情况下:

    frame.drop(labels='a', axis=1).corrwith(frame[['a']])
    

    frame[['a']] 是一个DataFrame,因为[['a']] 现在遵循DataFrame 规则,其中它的列必须与其关联的内容匹配。但是您从第一帧中明确删除了a,然后与DataFrame 关联,除了a 之外什么都没有。每一列的结果都是NaN

    【讨论】:

    • 好的,但是如果我有一些商店的数据怎么办。现在我想计算costamount 和我数据库中其他特征之间的相关性(daymonthis_salehour 等特征)。不幸的是,我们不能像frame[['cost', 'amount']].corrwith(frame.drop(labels=['cost', 'amount'], axis=1)) 这样编码。那么,我该怎么做呢?
    • 听起来您想将一个数据帧中的每一列与另一个数据帧中的每一列相关联。 frame[['cost', 'amount']] 有 2 列,说 frame.drop(labels=['cost', 'amount'], axis=1) 有 4 列,您正在寻找 2 x 4 的相关矩阵。我对吗?如果是这样,你需要问另一个问题。在这个问题中,您要求了解您观察到的行为。 MaxU和我自己已经解释过了。在这样解释时,您可能已经意识到 corrwith 可能不是您要寻找的东西,因为它不会为您提供 2 x 4 相关矩阵。
    • 不,我想了解这个函数的行为。我想了解这种行为的原因。可能是我最后的评论不太正确,但我认为,成对相关性将比当前行为更有用。而且更合乎逻辑,因为带有Series 的函数完全按照这种方式工作:计算成对相关性。
    • pairwise 表示如果我有 2 个列表,我将使用第一个和第二个,以此类推。想想python的zip。在这种情况下,corrwith 正在做同样的事情,只是它让columns 指导如何进行配对。当传递 Series 并在所有列中广播 Series 时会出现异常。这是为了方便,并且在技术上与文档不一致。但是,它的行为似乎是显而易见的选择并且很方便。您希望例外现在成为规则,而实际上并非如此。
    • @NikitaSivukhin,我认为你真的应该问另一个问题,并提供更多关于你想要实现什么的细节(正如 piRSquared 已经提出的那样) - 我感觉你正在做某事类似于feature selection,但这只是一个疯狂的猜测......
    【解决方案3】:

    enter image description here

    一个简单的输出

    【讨论】:

      【解决方案4】:

      抱歉有点晚了.. 没有办法进行系列的关联,而熊猫数据框只能用相同的columnz进行分析

      喜欢

      x = np.array([2, 4, 6, 8.2]).reshape(-1, 1)

      y = np.array([2.3, 3.11, .5, 7, 10, 11, 12]).reshape(-1, 1)

      a = pd.DataFrame(x, columns=['aa']) b = pd.DataFrame(y, columns=['aa'])

      a.corrwith(b)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-22
        • 2018-02-01
        • 2020-01-17
        • 2014-10-01
        • 2021-10-01
        • 1970-01-01
        • 2021-03-06
        • 2019-01-25
        相关资源
        最近更新 更多