Доступ к значениям в сгруппированных рядах панд - PullRequest
1 голос
/ 12 марта 2019

(Бьюсь об заклад, это глупый вопрос, извините!)

Вот простой код, повторяющий мою проблему:

rand_series = pd.Series(np.random.randint(1, 99, size = 100))
rand_series.index.name = 'user_id'
rand_series_binned = pd.cut(rand_series, [0, 10, 20, 30, 40, 50, 100])
rand_series_binned_grp = rand_series_binned.groupby(rand_series_binned)
rand_series_binned_sampled = rand_series_binned_grp.apply(lambda grp: grp.sample(1))
rand_series_binned_sampled

Результат, напечатанный на этом

           user_id
(0, 10]    32           (0, 10]
(10, 20]   0           (10, 20]
(20, 30]   91          (20, 30]
(30, 40]   75          (30, 40]
(40, 50]   98          (40, 50]
(50, 100]  29         (50, 100]
dtype: category
Categories (6, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 100]]

Как мне получить доступ к каждому элементу того, что есть?

Вот список того, что я пробовал.Есть 6 строк, поэтому я ожидал бы получить первый, таким образом

rand_series_binned_sampled[0]

или

rand_series_binned_sampled.iloc[0]

оба дают результат

Interval(0, 10, closed='right')

Это нерезультат, который я ожидал: 32.Или я могу индексировать с самого конца, например,

rand_series_binned_sampled[12]

дает

user_id
0    (10, 20]
dtype: category
Categories (6, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < 
(40, 50] < (50, 100]]

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

rand_series_binned_sampled[2,'user_id']  # KeyError
rand_series_binned_sampled[2]['user_id']  # KeyError
rand_series_binned_sampled[2][0]  # KeyError
rand_series_binned_sampled[2,0]  # KeyError
rand_series_binned_sampled[2].loc('user_id')  # ValueError

Я могу посмотреть на ключи и значения, но я не понимаю, результаты

rand_series_binned_sampled.values

дает

[(0, 10], (10, 20], (20, 30], (30, 40], (40, 50], (50, 100]]
Categories (6, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 100]]
rand_series_binned_sampled.keys

дает

<bound method Series.keys of            user_id
(0, 10]    32           (0, 10]
(10, 20]   0           (10, 20]
(20, 30]   91          (20, 30]
(30, 40]   75          (30, 40]
(40, 50]   98          (40, 50]
(50, 100]  29         (50, 100]
dtype: category
Categories (6, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 100]]>

Наконец, этот дает TypeError

for key, value in rand_series_binned_sampled:
    print(f'key: {key} value: {value}')

Я думаю, что достаточно неудачных примеров, чтобы дать некоторое представление о глубине моего замешательства.Что мне нужно сделать, чтобы пройти через это и получить ключи типа (0, 10] со значениями вроде 32 или даже просто получить доступ к этим user_id значениям вообще?

1 Ответ

1 голос
/ 12 марта 2019

У вас проблемы из-за мультииндекса.Один из вариантов - уровень сброса 0 и использование zip для создания диктата:

# sample data
np.random.seed(1)

rand_series = pd.Series(np.random.randint(1, 99, size = 100))
rand_series.index.name = 'user_id'
rand_series_binned = pd.cut(rand_series, [0, 10, 20, 30, 40, 50, 100])
rand_series_binned_grp = rand_series_binned.groupby(rand_series_binned)
rand_series_binned_sampled = rand_series_binned_grp.apply(lambda grp: grp.sample(1))

           user_id
(0, 10]    99           (0, 10]
(10, 20]   42          (10, 20]
(20, 30]   83          (20, 30]
(30, 40]   78          (30, 40]
(40, 50]   50          (40, 50]
(50, 100]  56         (50, 100]
dtype: category
Categories (6, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 100]]

затем, если вы хотите dict:

# reset_index and drop level 0
s_drop = rand_series_binned_sampled.reset_index(level=0, drop=True)
# use zip with dict
d = dict(zip(s_drop.index, s_drop))

{42: Interval(10, 20, closed='right'),
 50: Interval(40, 50, closed='right'),
 56: Interval(50, 100, closed='right'),
 78: Interval(30, 40, closed='right'),
 83: Interval(20, 30, closed='right'),
 99: Interval(0, 10, closed='right')}

# access interval from user_id
d[78]
# Interval(30, 40, closed='right')

Или если вы хотите продолжитьиспользовать ряд и хотите получить доступ к интервалу для user_id:

s_drop.loc[42]
# Interval(10, 20, closed='right')

# or use s_drop[42]

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

s_drop[s_drop == pd.Interval(20,30)].index
# Int64Index([83], dtype='int64', name='user_id')

Вы создаете многоиндексную серию из-за groupby здесь rand_series_binned_grp = rand_series_binned.groupby(rand_series_binned)

type(rand_series_binned_sampled.index)
# pandas.core.indexes.multi.MultiIndex

type(s_drop.index)
# pandas.core.indexes.numeric.Int64Index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...