"Сжатие" двух кадров данных по значениям столбца - PullRequest
2 голосов
/ 30 апреля 2020

все

Предположим, у меня есть такой фрейм данных:

df1 = pd.DataFrame({"A": range(6), "key": [0,1]*3})
df1

    A   key
0   0   0
1   1   1
2   2   0
3   3   1
4   4   0
5   5   1

и

df2 = pd.DataFrame({"C": ["k0-"+str(x) for x in range(3)] + ["k1-"+str(x) for x in range(3)] , "key": [0]*3 + [1]*3})   k0-1
df2

    C   key
0   k0-0    0
1   k0-1    0
2   k0-2    0
3   k1-0    1
4   k1-1    1
5   k1-2    1

Все значения в C являются уникальными, а значения в key У меня нет такого шаблона в реальном наборе данных.

Я пытаюсь объединить два с результирующим фреймом данных, где значения в столбце C будут взяты ровно один раз для совпадения значения в столбце key.

Т.е.

    A   key C
0   0   0   k0-0 
1   1   1   k1-0
2   2   0   k0-1
3   3   1   k1-1
4   4   0   k0-2
5   5   1   k1-2

Порядок не имеет значения, т.е. значения в C не должны приниматься последовательно. Это игрушечный пример, в реальности у меня ~ 10 ключей.

Я знаю, что, вероятно, могу выполнить внешнее соединение, а затем каким-то образом отбросить неуникальные значения C. Но это может быть излишним, так как в реальных наборах данных слишком много строк (~ 30k).

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вы можете построить словарь итераторов и вызвать next на соответствующем итераторе в зависимости от 'key'.

g = {k: iter(v) for k, v in df2.groupby('key').C}
df1.assign(C=[next(g[x]) for x in df1.key])

   A  key     C
0  0    0  k0-0
1  1    1  k1-0
2  2    0  k0-1
3  3    1  k1-1
4  4    0  k0-2
5  5    1  k1-2
2 голосов
/ 30 апреля 2020

Вы можете добавить дополнительный столбец для использования в объединении:

df1['order'] = df1.groupby('key').cumcount()
df2['order'] = df2.groupby('key').cumcount()

# If you want to match on random order:
# df2['order'] = df2.sample(frac=1).groupby('key').cumcount()

df1.merge(df2, on=['key', 'order'])

Результат:

   A  key  order     C
0  0    0      0  k0-0
1  1    1      0  k1-0
2  2    0      1  k0-1
3  3    1      1  k1-1
4  4    0      2  k0-2
5  5    1      2  k1-2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...