Получить общее количество столбцов Pandas
Target
У меня есть кадр данных Pandas, как показано ниже, с несколькими столбцами и хотел бы получить общее количество столбцов, MyColumn
.
Кадр данных - df
:
print df
X MyColumn Y Z
0 A 84 13.0 69.0
1 B 76 77.0 127.0
2 C 28 69.0 16.0
3 D 28 28.0 31.0
4 E 19 20.0 85.0
5 F 84 193.0 70.0
Моя попытка:
Я попытался получить сумму столбца с помощью groupby
и .sum()
:
Total = df.groupby['MyColumn'].sum()
print Total
Это приводит к следующей ошибке:
TypeError: 'instancemethod' object has no attribute '__getitem__'
Ожидаемый результат
Я ожидал, что результат будет следующим:
319
Или, наоборот, мне бы хотелось, чтобы df
редактировался с помощью нового row
под названием TOTAL
, содержащего общее количество:
X MyColumn Y Z
0 A 84 13.0 69.0
1 B 76 77.0 127.0
2 C 28 69.0 16.0
3 D 28 28.0 31.0
4 E 19 20.0 85.0
5 F 84 193.0 70.0
TOTAL 319
Ответы
Ответ 1
Вы должны использовать sum
:
Total = df['MyColumn'].sum()
print (Total)
319
Затем вы используете loc
с Series
, в этом случае индекс должен быть таким же, как и конкретный столбец, который нужно суммировать:
df.loc['Total'] = pd.Series(df['MyColumn'].sum(), index = ['MyColumn'])
print (df)
X MyColumn Y Z
0 A 84.0 13.0 69.0
1 B 76.0 77.0 127.0
2 C 28.0 69.0 16.0
3 D 28.0 28.0 31.0
4 E 19.0 20.0 85.0
5 F 84.0 193.0 70.0
Total NaN 319.0 NaN NaN
потому что если вы передадите скаляр, значения всех строк будут заполнены:
df.loc['Total'] = df['MyColumn'].sum()
print (df)
X MyColumn Y Z
0 A 84 13.0 69.0
1 B 76 77.0 127.0
2 C 28 69.0 16.0
3 D 28 28.0 31.0
4 E 19 20.0 85.0
5 F 84 193.0 70.0
Total 319 319 319.0 319.0
Два других решения с at
, и ix
смотрите приложения ниже:
df.at['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
X MyColumn Y Z
0 A 84.0 13.0 69.0
1 B 76.0 77.0 127.0
2 C 28.0 69.0 16.0
3 D 28.0 28.0 31.0
4 E 19.0 20.0 85.0
5 F 84.0 193.0 70.0
Total NaN 319.0 NaN NaN
df.ix['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
X MyColumn Y Z
0 A 84.0 13.0 69.0
1 B 76.0 77.0 127.0
2 C 28.0 69.0 16.0
3 D 28.0 28.0 31.0
4 E 19.0 20.0 85.0
5 F 84.0 193.0 70.0
Total NaN 319.0 NaN NaN
Примечание. Начиная с версии Pandas v0.20, ix
устарела. iloc
этого используйте loc
или iloc
.
Ответ 2
Другой вариант, вы можете пойти здесь:
df.loc["Total", "MyColumn"] = df.MyColumn.sum()
# X MyColumn Y Z
#0 A 84.0 13.0 69.0
#1 B 76.0 77.0 127.0
#2 C 28.0 69.0 16.0
#3 D 28.0 28.0 31.0
#4 E 19.0 20.0 85.0
#5 F 84.0 193.0 70.0
#Total NaN 319.0 NaN NaN
Вы также можете использовать метод append()
:
df.append(pd.DataFrame(df.MyColumn.sum(), index = ["Total"], columns=["MyColumn"]))
![enter image description here]()
Обновить:
Если вам нужно добавить сумму для всех числовых столбцов, вы можете сделать одно из следующих действий:
Используйте append
чтобы сделать это функционально (без изменения исходного фрейма данных):
# select numeric columns and calculate the sums
sums = df.select_dtypes(pd.np.number).sum().rename('total')
# append sums to the data frame
df.append(sums)
# X MyColumn Y Z
#0 A 84.0 13.0 69.0
#1 B 76.0 77.0 127.0
#2 C 28.0 69.0 16.0
#3 D 28.0 28.0 31.0
#4 E 19.0 20.0 85.0
#5 F 84.0 193.0 70.0
#total NaN 319.0 400.0 398.0
Используйте loc
для изменения фрейма данных на месте:
df.loc['total'] = df.select_dtypes(pd.np.number).sum()
df
# X MyColumn Y Z
#0 A 84.0 13.0 69.0
#1 B 76.0 77.0 127.0
#2 C 28.0 69.0 16.0
#3 D 28.0 28.0 31.0
#4 E 19.0 20.0 85.0
#5 F 84.0 193.0 70.0
#total NaN 638.0 800.0 796.0
Ответ 3
Аналогично получению длины кадра данных, len(df)
, для панд и блэйса сработало следующее:
Total = sum(df['MyColumn'])
или в качестве альтернативы
Total = sum(df.MyColumn)
print Total
Ответ 4
Как другой вариант, вы можете сделать что-то вроде ниже
Group Valuation amount
0 BKB Tube 156
1 BKB Tube 143
2 BKB Tube 67
3 BAC Tube 176
4 BAC Tube 39
5 JDK Tube 75
6 JDK Tube 35
7 JDK Tube 155
8 ETH Tube 38
9 ETH Tube 56
Ниже сценарий, вы можете использовать для вышеуказанных данных
import pandas as pd
data = pd.read_csv("daata1.csv")
bytreatment = data.groupby('Group')
bytreatment['amount'].sum()