如何用python描述矩阵中所有两个因子列的组合(平均值、中值、计数等)?

2024-04-25 16:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,看起来像这样:

enter image description here

给定行中的每个值要么是同一个数字,要么是一个NaN。我想计算dataframe中所有2列组合的平均值、中值和计数,其中两列都不是NaN。在

例如,上述数据帧的结果是:

AB: count: 1, mean: 7, median: 7 
AC: count: 2, mean: 9.5, median: 9.5 
BC: count: 2, mean: 9, median: 9

事实上,我的数据帧大约有50k行长,40列左右宽。在

如果你想知道,这是关于堆栈溢出开发人员调查的工作。Ami Tavory helped me get to this point.行是响应者。本例中的列是受访者告诉我们他们使用的编程语言。价值观就是你的年薪。我正在尝试确定哪种编程语言组合(也许是编码生态系统的代理)的回报最好。结果将在未来几周公布。我们真正的开发人员都在忙着构建真实的东西,所以我想我应该借此机会来戳你。我期待着你检查我的工作,当我们发布一个完整的数据转储在下个月左右。在

可以使用以下代码生成示例数据帧:

^{pr2}$

Tags: 数据dataframepandasab开发人员count数字nan
2条回答

这应该行得通(它在您的示例上有效,但我还没有在更大的数据集上测试过):

(nrow, ncol) = df.shape
for i in range(0,nrow-1):
    for j in range(i+1, nrow-1):
        temp = df.iloc[:,[i,j]].reset_index()
        temp.dropna(inplace=True)
        print temp.columns[1:].tolist(), len(temp), temp.ix[:,1].mean(), temp.ix[:,1].median()

你的例子给出了

^{pr2}$

为每对列创建一个新的dataframe,并删除任何带有“NA”的内容,然后对该临时数据帧执行基本统计。也许有一种更有效的方法可以做到这一点,但是你的数据帧足够小,这不应该是个大问题。在

我试着让它对你来说有一个合理的可伸缩性,因此使用列表而不是在pandas中完成。我在熊猫身上看到的唯一好方法是需要大量的行操作,而在大熊猫身上这种操作非常慢。在这里添加属性相当容易——只需在数组中添加一个名为outarr的列,并在创建输出数据帧时将其命名。在

import pandas as pd, numpy as np
import itertools
df = pd.DataFrame({'A' : [12,np.nan,np.nan,7],
                   'B' : [np.nan,11,8,7],
                   'C' : [12,11,np.nan,7]})

cols = df.columns.values #Columns from your dataframe
collist = list(itertools.combinations(cols,2)) #All combinations of columns from your df

#Create numpy array for each two-column combo and calculate count, mean, median
outarr = [0]*len(collist)
for ix, coltuple in enumerate(collist):
    a = df[list(coltuple)].dropna().values
    outarr[ix] = [a.shape[0],np.mean(a),np.median(a)]

#Create output dataframe
dfout = pd.DataFrame(outarr,index = collist,columns=['count','mean','median'])
dfout

Out[41]:
        count   mean    median
(A, B)  1       7.0     7.0
(A, C)  2       9.5     9.5
(B, C)  2       9.0     9.0

相关问题 更多 >