【发布时间】:2020-10-13 03:45:22
【问题描述】:
我有一个具有以下结构的数据框:
|file_id|metric_a|metric_b|metric_c|
|'1.xml'| 1 | 0.5 | 50 |
|'1.xml'| 1.5 | 0.55 | 65 |
|'2.xml'| 2 | 0.7 | 75 |
|'2.xml'| 2.5 | 0.75 | 80 |
因此,我想得到这张“metric_c”和其他列之间的相关表:
|file_id|correlation_a_c|correlation_b_c|
|'1.xml'| 0.7 | 0.8 |
|'2.xml'| 0.75 | 0.85 |
我用下面的代码来做,但看起来很糟糕:
metric_a_vs_metric_c_df = source_df.groupby('file_id')[
['metric_a', 'metric_c']].corr(method='spearman').iloc[0::2,-1].reset_index().rename(
columns={'metric_a': 'correlation_a_c'}
)
metric_b_vs_metric_c_df = source_df.groupby('file_id')[
['metric_b', 'metric_c']].corr(method='spearman').iloc[0::2,-1].reset_index().rename(
columns={'metric_b': 'correlation_b_c'}
)
joined_df = metric_a_vs_metric_c_df.set_index('file_id').join(metric_b_vs_metric_c_df.set_index('file_id'), lsuffix='_caller', rsuffix='_other')
print(joined_df)
是否存在使其更具可读性的方法?
【问题讨论】:
-
能否添加一些示例数据?
-
还有,预期的输出是什么?
-
在您的输入中,每个文件 ID 都有一个条目。为什么需要 groupby?此外,通常在两个数字系列之间计算相关性 - 而不是在单个元素之间 (AFAIK)。
-
只是一个实用的提示,以避免你的变量名有半英里长:你试图计算的是一个 crosstab,或简称
xt。因此,一个不错的名称选择是xt_ac和xt_bc。或corrxt_ac, corrxt_bc缩写为“相关交叉表”。这将有助于将您的行保持在 72-80 个字符以下的行长和可读性。我们不需要到处说metric_...。 (我个人会将第一个数据框中的三个变量列重命名为a, b,c) -
@Roy2012 是的,你是对的,我的行具有相同的 file_id 和不同的指标,这就是为什么我在我的代码示例中按文件 id 分组并在分组后找到相关性,
标签: python pandas dataframe correlation crosstab