Python pandas: как эффективно получить несколько подмножеств фреймов данных на основе столбца id - PullRequest
2 голосов
/ 09 июля 2020

У меня есть такой фрейм данных:

df = pd.DataFrame({'id': [1, 1, 1, 2, 2], 'C1': ['1A', '1B', '1C', '2A', '2B'], 'C2': [100, 200, 300, 400, 500]})
print(df)

   id  C1   C2
0   1  1A  100
1   1  1B  200
2   1  1C  300
3   2  2A  400
4   2  2B  500

Из этого фрейма данных, как мне получить несколько подмножеств для каждого значения 'id', например?

   id  C1   C2
0   1  1A  100
   id  C1   C2
0   1  1A  100
1   1  1B  200
   id  C1   C2
0   1  1A  100
1   1  1B  200
2   1  1C  300
   id  C1   C2
0   2  2A  400
   id  C1   C2
0   2  2A  400
1   2  2B  500

Я могу написать a для l oop, как показано ниже.

for id in df['id'].unique().tolist():
    df1 = df[df['id'] == id]
    for i in range(len(df1) + 1):
        df1 = df1.head(i)

Есть ли эффективный способ сделать это, потому что у меня есть тысячи значения в столбце id.

Я пробовал использовать df.apply, но он работает только с одной строкой (с осью = 1).

Моя конечная цель - закончить с фреймом данных, как показано ниже (где C2 - это сумма значений в столбце C2 подмножества фреймов данных).

    id  1A  1B  1C  2A  2B  C2
0    1   1   0   0   0   0  100
0    1   1   1   0   0   0  300
0    1   1   1   1   0   0  600
1    2   0   0   0   1   0  400
1    2   0   0   0   1   1  900

Если I go с подходом для l oop, я могу сделать групповой 'id', столбец суммы 'C2' и перекрестная таблица на фрейме данных подмножества, полученном во внутреннем для l oop. Затем я могу наконец выполнить pd.concat для всех результатов кросс-таблицы подмножества. Но я не знаю, как это сделать эффективнее. Пожалуйста, предложите.

1 Ответ

5 голосов
/ 09 июля 2020

Как правило, нет необходимости создавать все эти подмножества самостоятельно, потому что вы можете выполнять «кумулятивные» вычисления для достижения sh того, что вам нужно.

C2 является результатом накопительной суммы (cumsum) в каждом «ID». Ваши фиктивные столбцы являются результатом pd.get_dummies, а затем кумулятивного максимума (cummax) в каждой группе групп (кредит @ Ben.T). Присоединитесь к вычислениям с помощью concat, чтобы получить результат, и используйте groupby + ngroup, чтобы пометить каждый идентификатор для желаемого индекса.

# Dummies for C1
df1 = pd.get_dummies(df.C1)
df1 = df1.groupby(df['id']).cummax()

# Join, ID from df, dummies from df1 and cumsum
df1 = pd.concat([df['id'], df1, df.groupby('id')['C2'].cumsum()], axis=1)

# Create your index, breaks alignment of df and df1 from this point on     
df1.index = df1.groupby(df['id'], sort=False).ngroup()
print(df1)

   id  1A  1B  1C  2A  2B   C2
0   1   1   0   0   0   0  100
0   1   1   1   0   0   0  300
0   1   1   1   1   0   0  600
1   2   0   0   0   1   0  400
1   2   0   0   0   1   1  900
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...