Python получить argparse для суммирования данных по группам с помощью groupby - PullRequest
0 голосов
/ 27 мая 2020

У меня есть набор данных, который выглядит так, числа в столбцах NY, LA и CHI - это количество раз, когда люди посещали эти города.

import pandas as pd
data = {'Person':['A','B','C','D','E','F'], 
    'NY':[1, 1, 0, 3, 0, 0],
    'LA':[0, 1, 1, 0, 1, 1],
    'CHI':[2, 0, 1, 0, 0, 1],
    'Gender':['F','F','F','M','M','NA'],
    'Citizenship':['US','Canada','US','US','Mexico','Canada'],
    'Age':['30s','30s','50s','NA','20s','30s']} 
df = pd.DataFrame(data) 

Я суммирую те, которые принадлежат различным группам, определенным Gender, Citizenship или Age. Я мог бы сделать это, как показано ниже.

n_by_gender = df.groupby(['Gender']).sum()
n_by_citizenship = df.groupby(['Citizenship']).sum()
n_by_age = df.groupby(['Age']).sum()
pd.concat([df, n_by_gender, n_by_citizenship, n_by_age])

Теперь я пытаюсь написать модуль argparse, который может делать что-то похожее на это. Я хотел ввести в него два аргумента, чтобы люди могли выбирать, по какой группе они хотят суммировать данные. (Например, если люди набирают python modulename.py -Gender -Age, он вернет то, что я создал выше, за исключением строк, в которых суммировано количество посещений по гражданству.

import argparse

parser = argparse.ArgumentParser(description='Sum data by group')
parser.add_argument('-g', default = "Gender", type=str)  ### need to add some action here?
parser.add_argument('-c', default = "Citizenship", type=str)
args = parser.parse_args()

print(args.b_string)
print(args.c_string)

Я читал argparse документов и что для меня не имеет смысла, так это то, что каждое действие, кажется, добавляется внутри parser.add_argument() с использованием класса action? Как мне добавить команду groupby().sum() внутри parser.add_argument(), или это очень неправильное понимание того, как работает argparse?

1 Ответ

0 голосов
/ 27 мая 2020

Похоже, вы пытаетесь получить аргумент из argparse и передать его в функции обработки ваших данных. Если это так, то вот как вы это сделаете:

import argparse
parser = argparse.ArgumentParser(description='Sum data by group')
parser.add_argument("groupby1",default="Gender", type=str, help="groupby this column (case sensitive)")
parser.add_argument("groupby2",default="Citizenship", type=str, help="groupby this column (case sensitive)")

# Get your arguments
args = parser.parse_args()
groupby_1 = args.groupby1
groupby_2 = args.groupby2


# If they exist, perform your manipulation
all_agg = []
for g in [groupby1, groupby2]:
  if g:
    # Do it
    df_agg = df.groupby([g]).sum()
    all_agg.append(df_agg)

# This is not the best way to perform this aggregation
# but your question was focused on argparse so I'll skip over this part
df_agg = pd.concat(all_agg)

Выполнение этого файла будет происходить следующим образом:

python3 my_file.py Gender Citizenship
...