Более питонический способ для вложенных циклов

Решение периода месяца:

Сначала преобразуйте столбцы to_period из months, а также получите Period из now, а затем используйте itertuples с period_range , последний для datetimes использует to_timestamp :

df['a'] = df['on_pm_at'].dt.to_period('m')
now = pd.Period(pd.datetime.now().strftime('%Y-%m'),freq='m')
print (now)
2018-07

df1 = pd.concat([pd.Series(r.user_id,pd.period_range(r.a, now, freq='m')) 
                 for r in df.itertuples()]).reset_index()
df1.columns = ['months','user_id']
df1['months'] = df1['months'].dt.to_timestamp('m')
print (df1)
      months  user_id
0 2018-06-30     2124
1 2018-07-31     2124
2 2018-02-28    18420
3 2018-03-31    18420
4 2018-04-30    18420
5 2018-05-31    18420
6 2018-06-30    18420
7 2018-07-31    18420

Решение Datetime:

Аналогичный подход для последнего дня месяца преобразуется в month period, а затем в timestamp s и использует date_range :

df['a'] = df['on_pm_at'].dt.to_period('m').dt.to_timestamp('m')
now = pd.Timestamp(pd.datetime.now()).to_period('m').to_timestamp('m')
2018-07-31 00:00:00

df1 = pd.concat([pd.Series(r.user_id,pd.date_range(r.a, now, freq='m')) 
                 for r in df.itertuples()]).reset_index()
df1.columns = ['months','user_id']
print (df1)
      months  user_id
0 2018-06-30     2124
1 2018-07-31     2124
2 2018-02-28    18420
3 2018-03-31    18420
4 2018-04-30    18420
5 2018-05-31    18420
6 2018-06-30    18420
7 2018-07-31    18420

2
задан Simos 19 January 2019 в 19:12
поделиться

1 ответ

for item in data_dict:
    for k, v in item.items():
        if k == 'MATCH':
            print('found')

вы не используете dict должным образом, просто используете его как список кортежей. Просто напишите:

for item in data_dict:
    if 'MATCH' in item:
          print('found: ',item['MATCH'])
          # break here? not if you want multiple matches

то же самое касается другого цикла. Но я просто уменьшил сложность с O(n**2) до O(n). Вы по-прежнему выполняете линейный поиск в списке словарей, но он все еще не подходит.

Другой способ: создать один словарь со списками ваших элементов в качестве элементов вместо списка словарей с элементами.

Таким образом, вы получаете всю информацию с помощью 1 ключевого поиска. Практический пример:

Скажем, ваши данные выглядят так:

list_of_dicts = [
{'MATCH':12, 'foo':14},
{'MATCH':5, 'bar':2},
{'what':0}
]

преобразуйте их в виде списков с помощью collections.defaultdict(list):

import collections

dict_of_lists = collections.defaultdict(list)

for d in list_of_dicts:
    for k,v in d.items():
        dict_of_lists[k].append(v)

Давайте посмотрим на новый дикт:

>>> dict_of_lists
{'MATCH': [12, 5],
 'bar': [2],
 'foo': [14],
 'what': [0]}

, как только это будет сделано, просто получите все значения, соответствующие ключу с этим:

if 'MATCH' in dict_of_lists:
    print(dict_of_lists['MATCH'])

, который печатает:

[12, 5]

Преобразование, выполненное в начале, должно быть выполнено только один раз (или не совсем, если данные правильно организованы с самого начала), чтобы получить супер быструю & amp; легкий поиск данных.

0
ответ дан Jean-François Fabre 19 January 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: