Pandas - как часто каждая строка в разделенных запятыми строках присутствует в кадре данных - PullRequest
2 голосов
/ 09 апреля 2019

Я работаю с DataFrame, содержащим два столбца, один из которых содержит строки, разделенные запятыми, второй содержит целые числа.Я хочу перебрать столбец со строками, сохранить каждую уникальную строку из каждой строки, назначить целое значение из второго столбца для каждой строки.Другими словами,

A           B
a,b,c,d     0
a,b,c,d     10
a,b,d,e     89
a,b,d,e     111

В этом примере:

a = 220, b = 220, c = 10, d = 220, e = 210

Я выбираю интересные столбцы из моего CSV-файла,

revcat = DataFrame(data, columns = ['Tag', 'Revenue']) 

Это дает мне возможность суникальные значения в «Tag» и преобразовать его в другой DataFrame.

uniqtag = rev1.Tag.str.split(",").apply(pd.Series).stack().unique()
tag_stack = pd.DataFrame(uniqtag)

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

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Вы можете сделать с Series.str.get_dummies, Series.mul и Series.sum:

df['A'].str.get_dummies(sep=',').mul(df['B'], axis=0).sum()

a    210
b    210
c     10
d    210
e    200

Объяснение

df.A.str.get_dummies(sep=',')

Это дает DataFrame, который выглядит следующим образом:

   a  b  c  d  e
0  1  1  1  1  0
1  1  1  1  1  0
2  1  1  0  1  1
3  1  1  0  1  1

Тогда использование .mul с вашим столбцом значений даст:

     a    b   c    d    e
0    0    0   0    0    0
1   10   10  10   10    0
2   89   89   0   89   89
3  111  111   0  111  111

Что, наконец, применение .sum вдоль оси индекса даст вам ваш окончательный результат:

a    210
b    210
c     10
d    210
e    200
1 голос
/ 09 апреля 2019

Вот шаги, которые я бы использовал

  1. Разделить на "," и использовать expand=True, чтобы получить фрейм данных, где каждая буква находится в своем собственном столбце (яПредполагая прямо сейчас, основываясь на вашем примере, что у вас всегда одинаковое количество разбиений? Это правда?)

  2. «Расплавить» этот фрейм данных, чтобы вместо нескольких столбцов, созданных изкаждая строка в оригинальном df, у вас есть длинный фрейм данных, где каждая строка является буквой и ее индекс в оригинальном df.

  3. Преобразование из индексов в значения в Bстолбец

  4. Группировка по буквам и сумме по B.

import pandas as pd

data = [
    ("a,b,c,d", 0),
    ("a,b,c,d", 10),
    ("a,b,d,e", 89),
    ("a,b,d,e", 111),
]
df = pd.DataFrame(data, columns=["A", "B"])

#   A       B
# 0 a,b,c,d 0
# 1 a,b,c,d 10
# 2 a,b,d,e 89
# 3 a,b,d,e 111

melted = df.A.str.split(",", expand=True).reset_index().melt(id_vars="index", value_name="A")
melted["B"] = df.B.loc[melted["index"]].values
melted.groupby("A").B.sum()

# value
# a    210
# b    210
# c    10
# d    210
# e    200

Примечание. Я думаю, что у вас неверные суммы ввопрос;некоторые из них, кажется, выключены к 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...