Python - циклический просмотр списка дискретных корзин и выбор строк - PullRequest
1 голос
/ 15 октября 2019

У меня есть DataFrame с columnA с целочисленными значениями в диапазоне от -3 до 89. Я хочу выбрать все строки со значениями в columnA между дискретными 10 единицами, например,

-10до 0
0 до 10 ...
80 до 90

Я могу создать список количества строк в каждом бине, как показано ниже:

pd.cut(DataFrame['columnA'], np.arange(-10, 100, 10), include_lowest=True, labels=False).value_counts().sort_index().to_list()

, что приводит квот такой список:

[505, 25000, 21, 393, 79232, 953000, 24121, 662, 50, 900]

Теперь, если я хочу просмотреть все строки в первом бине, я могу выбрать их следующим образом:

DataFrame.sort_values('columnA', ascending=True).iloc[0:505]

Как я могунаписать функцию для выбора всех строк в ячейке N?

Редактировать: это работает, но только для ячейки 0. Если я использую iloc для, скажем, ячейки 1, мне нужно начать в концебен 0 и тд. Это та часть, где у меня возникают трудности.

def bin_func(DataFrame, N): 
    bins = pd.cut(DataFrame['columnA'], np.arange(-10, 100, 10), include_lowest=True, labels=False).value_counts().sort_index().to_list()
    if N == 0:
        return DataFrame.sort_values('columnA', ascending=True).iloc[0:bins[N]]
    else:
        return None

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Как насчет этого? Я предполагаю, что ваши лотки имеют форму [a, b [(закрыты на нижней границе и открыты на верхней.

df = pd.DataFrame(map(lambda x: int(x), (np.random.uniform(-3,89,1000))), columns=['ColumnA'])

def bin_func(df, N, col='ColumnA', xmin=-10, xmax=100, Nbins=10): 
    df_sorted = df.sort_values(col, ascending=True) 
    bins = np.arange(xmin, xmax, Nbins)
    if N > Nbins-1:
        return(pd.DataFrame())
    return(df_sorted[(df_sorted[col] >= bins[N]) & (df_sorted[col]<bins[N+1])])
0 голосов
/ 15 октября 2019

используйте DataFrame.groupby + Series.cumsum :

def get_bin(n):
     return df.groupby(df.index.isin([505, 25000, 21, 393, 79232, 953000, 24121, 662, 50, 900]).cumsum()).get_group(n)

, это разделит ваш фрейм данных на группы, называемые 0,1,2,3,4, 5 ... n.Вы выбираете, используя groupby.get_group .

Вот пример:

print(df)
   a  b  c  d
0  0  1  1  x
1  0  1  5  y
2  0  1  5  x
3  0  1  0  y
4  1  1  5  x
5  0  1  4  y
6  1  0  1  x
7  1  1  3  y
8  0  1  2  x
9  0  0  0  y

groups=df.index.isin([2,4,7,9]).cumsum()
print(groups)
#array([0, 0, 1, 1, 2, 2, 2, 3, 3, 4])

print(df.groupby(groups).get_group(0))
   a  b  c  d
0  0  1  1  x
1  0  1  5  y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...