петли в питоне для разных комбинаций - PullRequest
0 голосов
/ 10 мая 2019

У меня есть семь фреймов данных tbl1851, tbl1861, tbl1871, tbl1881, tbl1891, tbl1901, tbl1911.

Каждый фрейм данных имеет одинаковые поля «Пол», «Возраст», «Num».

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

Мой код выглядит как

AM1851 = ((tbl1851.Sex=="M") & (tbl1851.Age>=15) & (tbl1851.Age<999))
AM1861 = ((tbl1861.Sex=="M") & (tbl1861.Age>=15) & (tbl1861.Age<999))
AM1871 = ((tbl1871.Sex=="M") & (tbl1871.Age>=15) & (tbl1871.Age<999))
AM1881 = ((tbl1881.Sex=="M") & (tbl1881.Age>=15) & (tbl1881.Age<999))
AM1891 = ((tbl1891.Sex=="M") & (tbl1891.Age>=15) & (tbl1891.Age<999))
AM1901 = ((tbl1901.Sex=="M") & (tbl1901.Age>=15) & (tbl1901.Age<999))
AM1911 = ((tbl1911.Sex=="M") & (tbl1911.Age>=15) & (tbl1911.Age<999))

Мне интересно, существует ли скрипт цикла, который может достичь того жерезультаты в виде кодов, перечисленных выше?

Существует множество различных комбинаций выбора, поэтому я не хочу копировать, вставлять, исследовать и заменять много раз.

Ответы [ 3 ]

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

Вместо того, чтобы каждый кадр данных представлял собой отдельную переменную, поместите их в список:

frames = [
    # dataframe 1,
    # dataframe 2,
    # etc.
]

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

AMs = []
for frame in frames:
    AMs.append((frame.Sex=="M") & (frame.Age>=15) & (frame.Age<999))
0 голосов
/ 10 мая 2019

Вы можете сгруппировать их в массив и пройти через них:

tbls = [tbl1851, tbl1861, tbl1871, tbl1881, tbl1891, tbl1901, tbl1911]
my_func = lambda x : ((x.Sex=="M") & (x.Age>=15) & (x.Age<999))
AMs=[]
for df in k:
   AMs.append(df.apply(my_func))

И если вы хотите получить доступ к элементу по его именам, вместо создания списка вы можете создать словарь с именами переменных в качестве ключей к ним:

AM_names=["AM1851","AM1861","AM1871","AM1871","AM1881","AM1891","AM1901","AM1911"]
tbls = [tbl1851, tbl1861, tbl1871, tbl1881, tbl1891, tbl1901, tbl1911]
my_func = lambda x : ((x.Sex=="M") & (x.Age>=15) & (x.Age<999))
AMs={}
for idx, df in enumerate(tbls):
   AMs[df[AM_names[idx]]]=df.apply(my_func)
0 голосов
/ 10 мая 2019

Я думаю, что функция сделала бы это, так как каждая строка использует один и тот же tblxxxx объект 3 раза. Я бы попробовал что-то вроде:

def build_my_data_set(input_data_frame):
    return ((input_data_frame.Sex=="M") & (input_data_frame.Age>=15) & (input_data_frame.Age<999))

my_data_frames = [build_my_data_set(data_item) for data_item in [tbl1851, tbl1861, tbl1871]] # but you would fill the list with every item you want to include

Полученный my_data_frames будет представлять список со всеми объектами AMxxxx, которые вы определили. Тем самым сжимая их все в одну переменную, которую вы проиндексировали бы, чтобы найти соответствующий элемент. Если вам нужно связать бит xxxx, вы должны вместо этого реализовать словарь и использовать его в качестве ключа!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...