Получение количества строк от точек останова другого столбца - PullRequest
0 голосов
/ 21 мая 2018

Учтите, что в кадре данных есть два столбца A и B.Как я могу децилировать столбец A и использовать эти точки останова для столбца A в децилях для вычисления количества строк в столбце B ??

import pandas as pd
import numpy as np

df=pd.read_excel("E:\Sai\Development\UCG\qcut.xlsx")

df['Range']=pd.qcut(df['a'],10)

df_gb=df.groupby('Range',as_index=False).agg({'a':[min,max,np.size]})

df_gb.columns = df_gb.columns.droplevel()
df_gb=df_gb.rename(columns={'':'Range','size':'count_A'})

df['Range_B']=0
df['Range_B'].loc[df['b']<=df_gb['max'][0]]=1
df['Range_B'].loc[(df['b']>df_gb['max'][0]) & (df['b']<=df_gb['max'][1])]=2
df['Range_B'].loc[(df['b']>df_gb['max'][1]) & (df['b']<=df_gb['max'][2])]=3
df['Range_B'].loc[(df['b']>df_gb['max'][2]) & (df['b']<=df_gb['max'][3])]=4
df['Range_B'].loc[(df['b']>df_gb['max'][3]) & (df['b']<=df_gb['max'][4])]=5
df['Range_B'].loc[(df['b']>df_gb['max'][4]) & (df['b']<=df_gb['max'][5])]=6
df['Range_B'].loc[(df['b']>df_gb['max'][5]) & (df['b']<=df_gb['max'][6])]=7
df['Range_B'].loc[(df['b']>df_gb['max'][6]) & (df['b']<=df_gb['max'][7])]=8
df['Range_B'].loc[(df['b']>df_gb['max'][7]) & (df['b']<=df_gb['max'][8])]=9
df['Range_B'].loc[df['b']>df_gb['max'][8]]=10

df_gb_b=df.groupby('Range_B',as_index=False).agg({'b':np.size})

df_gb_b=df_gb_b.rename(columns={'b':'count_B'})

df_final = pd.concat([df_gb, df_gb_b], axis=1)

df_final=df_final[['Range','count_A','count_B']]

Есть ли какое-нибудь простое решение, которое я собираюсь сделать для стольких столбцов

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

В одну сторону -

df = pd.DataFrame({'A': np.random.randint(0, 100, 20), 'B': np.random.randint(0, 10, 20)})
bins = [0, 1, 4, 8, 16, 32, 60, 100, 200, 500, 5999]
labels = ["{0} - {1}".format(i, j) for i, j in zip(bins, bins[1:])]

df['group_A'] = pd.cut(df['A'], bins, right=False, labels=labels)
df['group_B'] = pd.cut(df.B, bins, right=False, labels=labels)

df1 = df.groupby(['group_A'])['A'].count().reset_index()
df2 = df.groupby(['group_B'])['B'].count().reset_index()

df_final = pd.merge(df1, df2, left_on =['group_A'], right_on =['group_B']).drop(['group_B'], axis=1).rename(columns={'group_A': 'group'})
print(df_final)

Выход

        group  A  B
0       0 - 1  0  1
1       1 - 4  1  3
2       4 - 8  1  9
3      8 - 16  2  7
4     16 - 32  3  0
5     32 - 60  7  0
6    60 - 100  6  0
7   100 - 200  0  0
8   200 - 500  0  0
9  500 - 5999  0  0
0 голосов
/ 21 мая 2018

Надеюсь, это поможет:

df['Range'] = pd.qcut(df['a'], 10)
df2 = df.groupby(['Range'])['a'].count().reset_index().rename(columns = {'a':'count_A'})

for item in df2['Range'].values:
    df2.loc[df2['Range'] == item, 'count_B'] = df['b'].apply(lambda x: x in item).sum()

df2 = df2.sort_values('Range', ascending = True)

, если вы хотите дополнительно подсчитать значения b , выходящие за пределы диапазона a :

min_border = df2['Range'].values[0].left
max_border = df2['Range'].values[-1].right

df2.loc[0, 'count_B'] += df.loc[df['b'] <= min_border, 'b'].count()
df2.iloc[-1, 2] += df.loc[df['b'] >  max_border, 'b'].count()
...