Подсчитать конкретное значение для идентификаторов в двух фреймах данных - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть два кадра данных

df1

+----+-------+
|    |   Key |
|----+-------|
|  0 |    30 |
|  1 |    31 |
|  2 |    32 |
|  3 |    33 |
|  4 |    34 |
|  5 |    35 |
+----+-------+

df2

+----+-------+--------+
|    |   Key | Test   |
|----+-------+--------|
|  0 |    30 | Test4  |
|  1 |    30 | Test5  |
|  2 |    30 | Test6  |
|  3 |    31 | Test4  |
|  4 |    31 | Test5  |
|  5 |    31 | Test6  |
|  6 |    32 | Test3  |
|  7 |    33 | Test3  |
|  8 |    33 | Test3  |
|  9 |    34 | Test1  |
| 10 |    34 | Test1  |
| 11 |    34 | Test2  |
| 12 |    34 | Test3  |
| 13 |    34 | Test3  |
| 14 |    34 | Test3  |
| 15 |    35 | Test3  |
| 16 |    35 | Test3  |
| 17 |    35 | Test3  |
| 18 |    35 | Test3  |
| 19 |    35 | Test3  |
+----+-------+--------+

Я хочу посчитать, какмного раз каждый Test указан для каждого Key.

+----+-------+-------+-------+-------+-------+-------+-------+
|    |   Key | Test1 | Test2 | Test3 | Test4 | Test5 | Test6 |
|----+-------|-------|-------|-------|-------|-------|-------|
|  0 |    30 |       |       |       |   1   |   1   |   1   |
|  1 |    31 |       |       |       |   1   |   1   |   1   |
|  2 |    32 |       |       |   1   |       |       |       |
|  3 |    33 |       |       |   2   |       |       |       |
|  4 |    34 |   2   |   1   |   3   |       |       |       |
|  5 |    35 |       |       |   5   |       |       |       |
+----+-------+-------+-------+-------+-------+-------+-------+

То, что я пробовал

Используя соединение и групповую работу, я сначала получил счетдля каждого Key независимо от Test.

result_df = df1.join(df2.groupby('Key').size().rename('Count'), on='Key')


+----+-------+---------+
|    |   Key |   Count |
|----+-------+---------|
|  0 |    30 |       3 |
|  1 |    31 |       3 |
|  2 |    32 |       1 |
|  3 |    33 |       2 |
|  4 |    34 |       6 |
|  5 |    35 |       5 |
+----+-------+---------+

Я пытался сгруппировать Key с Test

result_df = df1.join(df2.groupby(['Key', 'Test']).size().rename('Count'), on='Key')

, но это возвращает ошибку

ValueError: len(left_on) must equal the number of levels in the index of "right"

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот еще одно решение с groupby & pivot.При использовании этого решения вам вообще не нужен df1.

# | create some dummy data
tests = ['Test' + str(i) for i in range(1,7)]
df = pd.DataFrame({'Test': np.random.choice(tests, size=100), 'Key': np.random.randint(30, 35, size=100)})
df['Count Variable'] = 1

# | group & count aggregation
df = df.groupby(['Key', 'Test']).count()
df = df.pivot(index="Key", columns="Test", values="Count Variable").reset_index()
0 голосов
/ 20 февраля 2019

Проверка с crosstab

pd.crosstab(df2.Key,df2.Test).reindex(df1.Key).replace({0:''})
...