Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算数据帧切片的统计信息_Python_Pandas_Dataframe - Fatal编程技术网

Python 计算数据帧切片的统计信息

Python 计算数据帧切片的统计信息,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: df= pd.DataFrame({'A': np.random.randn(10), 'B': np.concatenate((np.repeat(np.nan, 4), np.array([0.7]), np.repeat(np.nan, 4), np.array([0.5]))), 'C': np.random.randn(10), 'D': np.concaten

我有以下数据帧:

df= pd.DataFrame({'A': np.random.randn(10),
                  'B': np.concatenate((np.repeat(np.nan, 4), np.array([0.7]), np.repeat(np.nan, 4), np.array([0.5]))),
                  'C': np.random.randn(10),
                  'D': np.concatenate((np.repeat(np.nan, 4), np.array([0.2]), np.repeat(np.nan, 4), np.array([0.15])))})
看起来是这样的:

    A           B    C           D
0   0.537109    NaN  -0.204046   NaN
1   0.744488    NaN   0.903607   NaN
2   0.640995    NaN   0.712210   NaN
3   0.212758    NaN   0.293984   NaN
4  -1.786725    0.7   0.282747   0.20
5   1.486037    NaN  -0.199659   NaN
6   0.267356    NaN   0.890397   NaN
7   0.697408    NaN  -0.771626   NaN
8   0.044247    NaN  -1.157836   NaN
9   0.345658    0.5   1.556390   0.15
我想计算一些统计数据,例如此数据帧切片上的平均值,例如,我希望结果如下所示:

    MeanA   B    MeanC  D
0   2.1     0.7  1.3    0.20
1   1.4     0.5  5.6    0.15 
换句话说,我想保留B列和D列中的非NA值,并计算B列和D列中高于/低于非NA值的A和C的平均值和其他值(在本例中,让我们将-1.786725包括在这两个平均值中,类似于0.282747)

注意:由于使用了np.random.randn(),所以MeanA和MeanC的值是由它们组成的


当然,我的真实数据帧包含更多的列和行,因此最好对其进行概括。

一种方法是手动使用索引。 让我们获取非NaN行的索引,例如

ind = np.array(df.dropna().index)

现在您已经知道了索引,可以手动执行操作。

您可以通过以下步骤解决问题:

  • 通过以下代码找出遇到第一个非Nan值的索引:

    index=df['B']。首先是有效的索引()

  • 现在用这些索引值切片df

    subset_df=df.iloc[0:索引+1:,]

  • 取所有列的子集df的平均值

    上半部分平均值=子集平均值(轴=0)

  • 对df的以下部分执行步骤2和3,然后只进行concat。

    这应该可以:

    b_nans = df[~df.B.isnull()].index.values
    cols_stats = ['A','C']
    cols_nans = ['B','D']
    df2 = pd.DataFrame(columns = [['mean_'+ col for col in cols] + cols_nans])
    
    for col_stat, col_nan in zip(cols_stats, cols_nans):
        df2[col_nan] = df[~df[col_nan].isnull()][col_nan].reset_index(drop=True)
        i_prev = 0
        for k,i in enumerate(b_nans):
            df2.loc[k, 'mean_'+ col_stat] = df.loc[i_prev:i,col_stat].mean()
            i_prev = i
    
    print(df2)
    
          mean_A    mean_C       B    D
    0   -0.059588   0.367446    0.7 0.20
    1   0.037202    0.373243    0.5 0.15
    

    这里有一个非常简单的方法。其思想是找到每列都包含一个值(断点)的行(索引)。迭代这些断点并使用这些索引获取数据帧的子切片。计算该切片中每列的平均值,这将返回该切片的单个序列。然后将这些切片(系列)连接在一起

    其中:

              A    B         C     D
    0 -0.378040  0.7 -0.073018  0.20
    1 -0.230593  0.5  0.817437  0.15
    

    B在某一行中有值,D在同一行中也有值吗?@Simon:是的,没错。你想在平均值计算中包括哪些确切值?您会在非NA值之上/之下走多远?
              A    B         C     D
    0 -0.378040  0.7 -0.073018  0.20
    1 -0.230593  0.5  0.817437  0.15