питон панды не считают порядковые пары - PullRequest
0 голосов
/ 05 июня 2018

У меня фрейм данных для панд выглядит так:

df = pd.DataFrame(data = {
    'v1': ['a', 'a', 'c', 'b', 'd', 'c', 'd', 'c', 'f', 'e'], 
    'v2': ['b', 'b', 'd', 'a', 'c', 'e', 'c', 'd', 'g', 'c'], 
    'v3': range(0,10)})

  v1 v2  v3
0  a  b   0
1  a  b   1
2  c  d   2
3  a  b   3
4  c  d   4
5  c  e   5
6  c  d   6
7  c  d   7
8  f  g   8
9  c  e   9

Я хочу получить результат, похожий на:

  v1 v2  count
0  a  b      2
1  c  d      3
2  c  e      2
3  f  g      1

Первая строка "a b 2", исходит от "a b""a b" 1010 *.поскольку "a b" отображается непрерывно дважды, считается только один раз.

Второй ряд "c d 3" происходит от "c d", "d c", "d c", "c d", как "d c" появляется непрерывно дважды

Третий ряд "c e 2" происходит от "c e", "e c"

Последний ряд "f g 1" происходит от "f g"

MyПервоначально предполагалось использовать groupby, но я не знаю, как пропустить непрерывный вид.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

С itertools.groupby, frozenset и collections.Counter

from itertools import groupby
from collections import Counter

counts = Counter(g[0] for g in groupby(map(frozenset, zip(df.v1, df.v2))))
pd.DataFrame([
    tuple(s) + (v,) for s, v in counts.items()
], columns='v1 v2 count'.split())

  v1 v2  count
0  b  a      2
1  c  d      3
2  c  e      2
3  g  f      1

Что происходит

  • Сначала я хочу сделать сеты из парзначения для определения эквивалентности, несмотря на порядок.Тем не менее, set не является хэшируемым, и поэтому я использую frozenset
  • Во-вторых, я использую groupby, потому что он разбивает мою итерацию на последовательно эквивалентные вещи
  • В-третьих, я прохожу счет какмного раз каждый уникальный frozenset встречается как первая часть предметов из groupby
  • В-четвертых, я анализирую этот результат в DataFrame

Подобныйвещь, но с использованием sorted и tuple вместо frozenset

pd.Series(
    Counter(g[0] for g in groupby(map(sorted, zip(df.v1, df.v2)), key=tuple))
).rename_axis(['v1', 'v2']).reset_index(name='count')

  v1 v2  count
0  a  b      2
1  c  d      3
2  c  e      2
3  f  g      1
0 голосов
/ 05 июня 2018

Сортируйте первые два столбца, отбрасывайте последовательных дубликатов и затем подсчитывайте их:

df.iloc[:, :2] = np.sort(df.iloc[:, :2], axis=1)

m = ~df.iloc[:, :2].ne(df.iloc[:, :2].shift()).cumsum().duplicated()
df[m].groupby(['v1', 'v2'], as_index=False).count()

  v1 v2  v3
0  a  b   2
1  c  d   3
2  c  e   2
3  f  g   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...