Как использовать операторы if для возврата элементов фрейма данных в Excel

#python #excel #pandas #dataframe #dictionary

#python #excel #pandas #фрейм данных #словарь

Вопрос:

Мои извинения, если это очень просто. Я пытался научить себя программировать через карантин, так что я совсем новичок. Моя цель — создать оператор if, который возвращает каждый тикер и его соответствующую позицию в определенные столбцы в Excel на основе группы, к которой принадлежит тикер.

Тикеры и позиции содержатся в фрейме данных, который я преобразовал в два списка, я также преобразовал его в словарь. Кажется, ничто не помогает решить проблему в целом. В моем словаре тикеры используются в качестве ключей, а позиции — в качестве значений. Мои списки содержат все тикеры и все позиции. Вставка того, что возвращается из print(dict) ниже:

 {'Position': {'AKERBP': 0, 'APA': -189, 'AR': 0, 'ASCRES': 100, 'CENREP': 0, 'CHK': 0, 'CITHOL': 230, 'CLR': 900, 'CNX': 702, 'CPE': 230, 'CRK': -8, 'CRROCK': -497, 'CVECN': 139, 'DOUBEA': 265, 'ENDENR': 504, 'EQT': 482, 'FANG': 0, 'GPOR': 0, 'GRTWST': 0, 'HILCRP': -843, 'INDNAT': 120, 'JAG': 0, 'LPI': 304, 'MEGCN': 500, 'MSSCRK': 0, 'MTDR': 237, 'MUR': 0, 'NOG': 0, 'OAS': 0, 'OVV': 530, 'OXY': 879, 'PARSLY': 421, 'PDCE': -89, 'QEP': 0, 'RRC': -436, 'SM': -198, 'SRCI': 0, 'SWN': 532, 'SXCP': 862, 'TPGE': 0, 'VIICN': 89, 'VNOM': 0, 'VRI': 987, 'WES': 89, 'WLL': 0, 'WPX': 654, 'XOG': 0}}
 

Два списка, которые я создал, называются тикерами и позициями. Список тикеров содержит все ключи словаря (AKERBP, APA, AR ..) список позиций содержит все значения (0, -189, 0 …).

Ниже приведены мои группировки для моих операторов if:

 permian = ['APA', 'CENREP', 'CRROCK', 'DOUBEA', 'ENDENR', 'JAG', 'LPI', 'MSSCRK', 'MTDR', 'OVV', 'OXY', 'PARSLY', 'VNOM', 'WES', 'WPX']
beta = ['CLR', 'CPE', 'CVECN', 'HILCRP', 'MEGCN', 'NOG', 'OAS', 'QEP', 'SM', 'WLL', 'VIICN']
gas = ['AR', 'ASCRES', 'CNX', 'CRK', 'EQT', 'FANG', 'GPOR', 'RRC', 'SWN', 'VRI']
 

До сих пор я делал следующее:

 df = pd.DataFrame(df.groupby('Ticker(s)')['Position'].sum())
tickerlist = df.groupby('Ticker(s)')['Position'].sum().to_frame('Position').reset_index()
tickers = tickerlist['Ticker(s)'].values.tolist()
p=3  
b=3
g=3
o=3

for ticker in tickers:
    tickers = "%s %s"%(tickers,ticker.strip())
    if ticker in permian:
        sheet.cell(row=p, column=9).value = ticker
        p  = 1
    elif ticker in beta:
        sheet.cell(row=b, column=12).value = ticker
        b  = 1
    elif ticker in gas:
        sheet.cell(row=g, column=15).value = ticker
        g  = 1
    else:
        sheet.cell(row=o, column=18).value = ticker
        o  = 1
    
 

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

 dict=df.to_dict()
for key, value in dict.items():
    if key in permian:
        sheet.cell(row=p, column=9).value = str(key)
        sheet.cell(row=p, column=10).value = str(value)
        p  = 1
    elif key in beta:
        sheet.cell(row=b, column=12).value = str(key)
        sheet.cell(row=b, column=13).value = str(value)
        b  = 1
    elif key in gas:
        sheet.cell(row=g, column=15).value = str(key)
        sheet.cell(row=g, column=16).value = str(value)
        g  = 1
    else:
        sheet.cell(row=o, column=18).value = str(key)
        sheet.cell(row=o, column=19).value = str(value)
        o  = 1
 

У меня это не сработало. Весь мой словарь оказался в ячейке R3. Если я могу изменить свой код, чтобы получить все это в одном цикле for , это было бы предпочтительнее. Однако, учитывая, что я знаю, что мой первый код работает, я мог бы также выполнить поиск ключа словаря в Excel (поскольку он заполняется правильно) и написать код, который будет заполнять его значение рядом с ним. Я просто не смог понять, как зайти так далеко. Любая помощь здесь была бы очень признательна!

Комментарии:

1. Вы получите гораздо больше помощи, если опубликуете некоторые из своих данных, которые можно легко скопировать и вставить. Попробуйте опубликовать вывод df.head(20).to_dict()

2. Я отредактировал свой пост и добавил выходные данные своего словаря. Я надеюсь, что это более понятно. Спасибо за совет!

Ответ №1:

Если это ваш df:

 df = pd.DataFrame.from_dict({'Position': {'AKERBP': 0, 'APA': -189, 'AR': 0, 'ASCRES': 100, 'CENREP': 0, 'CHK': 0, 'CITHOL': 230, 'CLR': 900, 'CNX': 702, 'CPE': 230, 'CRK': -8, 'CRROCK': -497, 'CVECN': 139, 'DOUBEA': 265, 'ENDENR': 504, 'EQT': 482, 'FANG': 0, 'GPOR': 0, 'GRTWST': 0, 'HILCRP': -843, 'INDNAT': 120, 'JAG': 0, 'LPI': 304, 'MEGCN': 500, 'MSSCRK': 0, 'MTDR': 237, 'MUR': 0, 'NOG': 0, 'OAS': 0, 'OVV': 530, 'OXY': 879, 'PARSLY': 421, 'PDCE': -89, 'QEP': 0, 'RRC': -436, 'SM': -198, 'SRCI': 0, 'SWN': 532, 'SXCP': 862, 'TPGE': 0, 'VIICN': 89, 'VNOM': 0, 'VRI': 987, 'WES': 89, 'WLL': 0, 'WPX': 654, 'XOG': 0}})
 

При запуске df.to_dict() ключи — это имена столбцов, поэтому я ожидаю, что он всегда записывается в ваш столбец по умолчанию:

 print(df.to_dict())
 

Вывод

 'Position': {'AKERBP': 0,
  'APA': -189,
  'AR': 0,
  'ASCRES': 100,
  'CENREP': 0,
  'CHK': 0,
  ...
 

Если вы хотите, чтобы ключами были имена тикеров, вы можете работать .to_dict() только с Position рядом:

 print(df['Position'].to_dict())
 

Вывод

 {'AKERBP': 0,
 'APA': -189,
 'AR': 0,
 'ASCRES': 100,
 'CENREP': 0,
 'CHK': 0,
 'CITHOL': 230,
...
 

Таким образом, ваш код будет выглядеть примерно так

 d=df["Position"].to_dict()
for key, value in d.items():
    if key in permian:
        sheet.cell(row=p, column=9).value = str(key)
        sheet.cell(row=p, column=10).value = str(value)
        p  = 1
    elif key in beta:
        sheet.cell(row=b, column=12).value = str(key)
        sheet.cell(row=b, column=13).value = str(value)
        b  = 1
    elif key in gas:
        sheet.cell(row=g, column=15).value = str(key)
        sheet.cell(row=g, column=16).value = str(value)
        g  = 1
    else:
        sheet.cell(row=o, column=18).value = str(key)
        sheet.cell(row=o, column=19).value = str(value)
        o  = 1
 

Комментарии:

1. Это сделало это! Большое вам спасибо. Действительно ценю помощь.

Ответ №2:

Попробуйте использовать df.to_clipboard() в какой-то момент вашего кода, когда у вас есть фрейм данных в формате, который вы хотите скопировать в Excel.

df.to_clipboard() копирует ваш фрейм данных в системный буфер обмена, что позволяет легко вставить его в Excel.

Также просто отметим, что трудно определить вашу точную цель. Похоже, вы хотите использовать Excel только в качестве резервной копии, но это ключевой вопрос, который вы задаете в названии.

Комментарии:

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