Альтернативный способ выбора нескольких столбцов и fillna () в нескольких столбцах с использованием панд - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь выбрать три столбца ["attacktype1", "attacktype2", "attacktype3"], чьи типы данных являются целыми числами из фрейма данных с использованием панд, и я хочу заполнить (0) этими столбцами и объединить эти столбцы в новый колонка. [ "Total_attacks"]

Набор данных можно загрузить с: Нажмите [здесь] https://s3.amazonaws.com/datasetsgun/data/terror.csv

Я пытался применять fillna (0) к одному столбцу за раз, а затем суммировать их в новый отдельный столбец.

Мой первый путь:

da1 = pd.read_csv('terror.csv', sep = ',', header=0 , encoding='latin' , na_values=['Missing', ' '])
da1.head()
#Handling missing values
da1['attacktype3'] = da1['attacktype3'].fillna(0)
da1['attacktype2'] = da1['attacktype2'].fillna(0)
da1['attacktype1'] = da1['attacktype1'].fillna(0)
da1['total_attacks'] = da1['attacktype3'] + da1['attacktype2'] + da1['attacktype1']

#country_txt is a column which consists of different countries.Want to find "Total_atacks" only for India. Therefore, the condition applied is country_txt=='India'.

a1 = da1.query("country_txt=='India'").agg({'total_attacks':np.sum})
print(a1)

Мой второй способ (который не работает):

da1 = pd.read_csv('terror.csv', sep = ',', header=0 , encoding='latin' , na_values=['Missing', ' '])
da1.head()
#Handling missing values
check1=Df.country_txt=="India"
store=Df[["attacktype1","attacktype2","attacktype3"]].apply(lambda x:x.fillna(0))

Total_attack=Df.loc[check1,store].sum(axis=1)
print(Total_attack)



I want to apply fillna(0) to multiple columns in a single line and also total those columns in an alternate and effective way.

The error that I get when I use my second way is:

ValueError: Cannot index with multidimensional key

1 Ответ

1 голос
/ 19 мая 2019

Сначала отфильтруйте по boolean indexing с DataFrame.loc, а затем замените пропущенные значения на DataFrame.fillna:

check1 = Df.country_txt == "India"
cols = ["attacktype1","attacktype2","attacktype3"]

Df['Total_attack'] = Df.loc[check1, cols].fillna(0).sum(axis=1)

Для скалярного вывода на одно число добавить sum:

Total_attack = Df['Total_attack'].sum()
print (Total_attack)
35065.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...