小编Zan*_*hin的帖子

将解决方案应用于实际数据时的结果不正确

我试图将此问题中提供的解决方案应用于我的实际数据:在MultiIndexed数据帧中选择行.不知怎的,我无法得到应该给出的结果.我已经附加了数据框以供选择,以及结果.

我需要的;

应返回第3行,第11行和第12行(当您连续添加4列时,也应选择12列.现在不是.)

    df_test = pd.read_csv('df_test.csv')

    def find_window(df):
        v = df.values
        s = np.vstack([np.zeros((1, v.shape[1])), v.cumsum(0)])

        threshold = 0

        r, c = np.triu_indices(s.shape[0], 1)
        d = (c - r)[:, None]
        e = s[c] - s[r]
        mask = (e / d < threshold).all(1)
        rng = np.arange(mask.shape[0])

        if mask.any():
            idx = rng[mask][d[mask].argmax()]

            i0, i1 = r[idx], c[idx]
            return pd.DataFrame(
                v[i0:i1],
                df.loc[df.name].index[i0:i1],
                df.columns
            )

    cols = ['2012', '2013', '2014', '2015']

    df_test.groupby(level=0)[cols].apply(find_window)
Run Code Online (Sandbox Code Playgroud)

csv_file位于:https://docs.google.com/spreadsheets/d/19oOoBdAs3xRBWq6HReizlqrkWoQR2159nk8GWoR_4-g/edit?usp = sharing

编辑:添加了正确的数据帧. 在此输入图像描述

在此输入图像描述

注意:蓝框=应返回的行,黄框是连续的列值<0(阈值).

numpy dataframe pandas

9
推荐指数
1
解决办法
538
查看次数

选择MultiIndexed数据框中的行

我想单独提取'S'的箱子,其中每列(X和Y)> 0.5,或多个箱子> 0.5*'行数'.

在这个例子中;

'AR1'应该只选择bin 4,因为'X'和'Y'> 0.5(蓝色表示)

因为'X'和'Y'是>(4*0.5)(指示黄色),所以'PO1'应该选择第1,2,3和4个区域.

我之前尝试过这个for loop,但是没有正常工作; 有条件地选择多个(相邻)行

np.random.seed(0)

N = 20
S = ['AR1', 'PO1']

df = pd.DataFrame(
    {'X':np.random.uniform(-1,1,N),
     'Y':np.random.uniform(-1,1,N),
     'S':np.random.choice(S,N),
    })

df['bins_X'] = df.groupby('S')['X'].apply(pd.qcut, q=5, labels=np.arange(5))    # create bins per column 'S'

def func(df):                                                                   # create function to group per 'S' and their bins
    df1 = df.groupby(['S','bins_X']).sum()
    new_cols= list(zip(df1.columns.get_level_values(0)))
    df1.columns = pd.MultiIndex.from_tuples(new_cols)
    return df1

print func(df)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

应该看起来像是问题中显示的df,但是不符合条件的行被过滤掉了.我检查的是这个; 分别或组合的任何行(bin)的X和Y值> 0.5.行的组合仅连续,2,3,4或5行组合.

即,0的行组合是; 0 + 1,0 + 1 + 2,0 + 1 + 2 + …

python numpy pandas

8
推荐指数
1
解决办法
359
查看次数

为总计添加值和列的计数

import pandas as pd
import numpy as np

df = pd.DataFrame( {
   'A': ['d','d','d','f','f','f','g','g','g','h','h','h'],
   'B': [5,5,6,7,5,6,6,7,7,6,7,7],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1],
   'S': [2012,2013,2014,2015,2016,2012,2013,2014,2015,2016,2012,2013]     
    } );

df = (df.B + df.C).groupby([df.A, df.S]).sum().unstack(fill_value=0)
print (df)

S  2012  2013  2014  2015  2016
A                              
d     6     6     7     0     0
f     7     0     0     8     6
g     0     7     8     8     0
h     8     8     0     0     7
Run Code Online (Sandbox Code Playgroud)

我想添加每年在数据框中求和的值的计数以及两个额外的列[总年份]和[总计数]

编辑;

Dataframe should look something like this;
    S  2012 2012 2013 2013 2014 2014 2015  2015 Tot(sum) Tot(#) …
Run Code Online (Sandbox Code Playgroud)

python group-by pivot-table multi-index pandas

5
推荐指数
1
解决办法
486
查看次数

同时通过一个函数传递多个数据帧

如何同时通过func传递df10和df20(甚至更多数据帧)并保留其名称以备将来使用?

import pandas as pd
import numpy as np

df = pd.DataFrame( {
   'A': ['d','d','d','d','d','d','g','g','g','g','g','g','k','k','k','k','k','k'],
   'B': [5,5,6,4,5,6,-6,7,7,6,-7,7,-8,7,-6,6,-7,50],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2],
   'S': [2012,2013,2014,2015,2016,2012,2012,2014,2015,2016,2012,2013,2012,2013,2014,2015,2016,2014]     
    } );

df10 = (df.B + df.C).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0)

df20 = (df['B'] - df['C']).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0)

def func(df):
    df1 = df.groupby(level=0, axis=1).sum()
    new_cols= list(zip(df1.columns.get_level_values(0),['total'] * len(df.columns)))
    df1.columns = pd.MultiIndex.from_tuples(new_cols)
    df2 = pd.concat([df1,df], axis=1).sort_index(axis=1).sort_index(axis=1, level=1)
    df2.columns = ['_'.join((col[0], str(col[1]))) for col in df2.columns]
    df2.columns = df2.columns.str.replace('sum_','')
    df2.columns = df2.columns.str.replace('size_','T')
    return df2
Run Code Online (Sandbox Code Playgroud)

根据要求编辑打印的数据框;

打印(df10)打印(df20)

df10:

    sum size
S   2012    2013    2014    2015    2016 …
Run Code Online (Sandbox Code Playgroud)

python pandas

1
推荐指数
1
解决办法
2171
查看次数

在数据帧列表上应用操作

从这个问题中选择只有一个我正在尝试使用的负值的列,并将解决方案更改为数据框列表,然后选择符合条件的数据框.虽然不能使它工作.

在下面的示例中,我想返回"Z"列中只有一个或更少负值的数据帧.

在这种情况下df1.

例;

 N = 5

 np.random.seed(0)

 df1 = pd.DataFrame(
         {'X':np.random.uniform(-3,3,N),
          'Y':np.random.uniform(-3,3,N),
          'Z':np.random.uniform(-3,3,N),
               })

 df2 = pd.DataFrame(
         {'X':np.random.uniform(-3,3,N),
          'Y':np.random.uniform(-3,3,N),
          'Z':np.random.uniform(-3,3,N),
               })

          X         Y         Z
0  0.292881  0.875365  1.750350
1  1.291136 -0.374477  0.173370
2  0.616580  2.350638  0.408267
3  0.269299  2.781977  2.553580
4 -0.458071 -0.699351 -2.573784
----------------
          X         Y         Z
0 -2.477224  2.871710  0.839526
1 -2.878690  1.794951 -2.139880
2  1.995719 -0.231124  2.668014
3  1.668941  1.683175  0.131090
4  2.220073 -2.290353 -0.512028
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?提前致谢.

python dataframe pandas

0
推荐指数
1
解决办法
86
查看次数

标签 统计

pandas ×5

python ×4

dataframe ×2

numpy ×2

group-by ×1

multi-index ×1

pivot-table ×1