我试图将此问题中提供的解决方案应用于我的实际数据:在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(阈值).
我想单独提取'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 + …
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) 如何同时通过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) 从这个问题中选择只有一个我正在尝试使用的负值的列,并将解决方案更改为数据框列表,然后选择符合条件的数据框.虽然不能使它工作.
在下面的示例中,我想返回"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)
我怎么能做到这一点?提前致谢.