#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я работаю с фреймом данных, содержащим два столбца, один из столбцов содержит строки, разделенные запятыми, второй содержит целые числа. Я хочу выполнить итерацию по столбцу со строками, сохранить каждую уникальную строку из каждой строки, присвоить целочисленное значение из второго столбца каждой строке. Другими словами,
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)
Я застрял здесь. Как, исходя из этого, мне выполнить итерацию по исходному столбцу ‘Tag’, используя уникальные строки, которые я нашел, и суммировать значения из столбца ‘Revenue’ для каждого ‘Tag’?
Ответ №1:
Вы могли бы использовать 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=',')
В результате получается фрейм данных, который выглядит следующим образом:
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
Ответ №2:
Вот шаги, которые я бы использовал
-
Разделите на «,» и используйте
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.