Я работаю с 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'])
Это дает мне ndarray с уникальными значениями в «Tag» и преобразует его в другой DataFrame.
uniqtag = rev1.Tag.str.split(",").apply(pd.Series).stack().unique()
tag_stack = pd.DataFrame(uniqtag)
Я застрял здесь. Как, исходя из этого, выполнить итерацию по исходному столбцу «Тег», используя уникальные строки, которые я нашел, и суммировать значения из столбца «Доход» для каждого «Тега»?
Вот шаги, которые я бы использовал
Разделите на «,» и используйте expand=True
, чтобы вернуть фрейм данных, где каждая буква находится в своем собственном столбце (сейчас я предполагаю, основываясь на вашем примере, что у вас всегда одинаковое количество разделений? Это правда?)
«Расплавьте» этот фрейм данных, чтобы вместо создания нескольких столбцов из каждой строки в исходном df у вас был длинный фрейм данных, где каждая строка представляет собой букву и ее индекс в исходном df.
Преобразование индексов в значения в столбце B
Сгруппируйте по букве и просуммируйте по 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.
Вы могли бы сделать с 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