Как выполнить fuction sum () в столбце с df concate с другим df - PullRequest
0 голосов
/ 19 октября 2019

Я использую concat, чтобы объединить 5 равных df в одну и получить общую сумму () стоимости.

Эти значения не являются реальными, просто пример того, как df выглядит как

Что я пробовал:

import pandas as pd

g = {"id": "1515", "cost": "100"}
b = {"id": "1515", "cost": "100"}
f = {"id": "1515", "cost": "100"}
c = {"id": "1515", "cost": "100"}
o = {"id": "1515", "cost": "100"}

all_vendors = pd.concat([g, b, f, c, o])

Типы данных

all_vendors.dtypes

Campaign          object
campaignid       float64
Campaign_name     object
Cost              object
Month             object
Year & month      object
dtype: object

Попытки

Попытка # 1:

all_vendors.Cost.sum()

Результатов:

TypeError: может объединять только str (не "float") в str

Попытка № 2:

all_vendors.Cost.astype(str)
all_vendors.Cost.sum()

Результат:

TypeError: может объединять только str (не "float") в str

Попытка № 3:

all_vendors.Cost.astype(float)
all_vendors.Cost.sum()

Результат:

ValueError: не удалось преобразовать строку в число с плавающей точкой: '100'

Ответы [ 4 ]

2 голосов
/ 19 октября 2019

Ваша проблема в том, что вы не переназначаете свой astype обратный вызов на DataFrame:

import pandas as pd

data = {
  "id": ['1,515','1,515','1,515','1,515','1,515'],
  "cost": ['1,000','1,000','1,000','1,000','1,000']
}

all_vendors = pd.DataFrame.from_dict(data)

all_vendors['cost'] = all_vendors.cost.str.replace(',','').astype(float)
print(all_vendors.cost.sum())
# Output: 500

Как упоминалось в комментариях, используйте str.replace, чтобы удалить все запятые вваши строки

1 голос
/ 19 октября 2019

Проверьте, помогает ли это. Это даст общее количество идентификаторов.

import pandas as pd

g = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
b = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
f = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
c = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
o = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
all_vendors = pd.concat([g, b, f, c, o])

a=pd.DataFrame.from_records(all_vendors).astype(float).groupby('id').sum().T.to_dict()
print(a)
1 голос
/ 19 октября 2019

Я получил это, чтобы работать на моем конце со значением 500:

df_list = [pd.DataFrame(data={"id": ["1515"], "cost": ["100"]}) for i in range(5)]
pd.concat(df_list).cost.astype(float).sum()

До тех пор, пока они представляют собой кадры данных и вы преобразуете строки в числа с плавающей точкой, это выглядит хорошо.

1 голос
/ 19 октября 2019

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

import pandas as pd
g = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
b = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
f = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
c = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
o = pd.DataFrame({"id": ["1515"], "cost": ["100"]})
all_vendors = pd.concat([g, b, f, c, o])

, если выв вашей строке есть ',', тогда вам нужно:

all_vendors['cost']=all_vendors['cost'].str.replace(',','')

Затем вы вычисляете сумму:

all_vendors.astype(float).cost.sum()

Вывод:

500.0

если вы хотите работать с фреймом данных типа float, вам нужно назначить его:

all_vendors2=all_vendors.astype(float)
all_vendros2.cost.sum()

Выход:

500
...