Применение логики к вложенной функции добавления

#python #pandas

#python #pandas

Вопрос:

У меня есть однозначное соответствие между значениями словаря d и df1 к которому я создал фрейм данных из добавленных элементов.

Строка df11 в настоящее время жестко запрограммирована, потому что я знаю количество ключей в моем d , т.Е. Я специально пишу append 3 раза с соответствующим df.loc[n] in df11

Ввод:

 Sn=['1','2','3']
Dn=['X','Y','Z']

d={}
for num1 in Sn:
    for num2 in Dn:
        key = f'Sn{num1}{num2}'
        value = pd.DataFrame({'A':[f'-{num1}O{num2}-']})
        d[key] = value

df1 = pd.DataFrame({'A':[45,23,76]})
df11=d['Sn1X'].append(df1.loc[0]).append(d['Sn1Y']).append(df1.loc[1])
  

Вывод: df1

     A
0   45
1   23
2   76 
  

Вывод: df11

         A
0   -1OX-
0   45
0   -1OY-
1   23   
  

Как бы я применил логику df11 к n количеству ключей, указанных в словаре / df1?
Например, мне пришлось бы добавить дополнительные добавления, чтобы получить последнюю строку в ‘df1`

 dfF=d['Sn1X'].append(df1.loc[0]).append(d['Sn1Y']).append(df1.loc[1]).append(d['Sn1Z']).append(df1.loc[2])
  

Вывод: dfF

        A
0   -1OX-
0   45
0   -1OY-
1   23
0   -1OZ-
2   76
  

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

1. Зачем вам нужен словарь? Если у вас есть некоторый контент в виде списков, логически должно быть возможно получить желаемый результат в dataframe. Я думаю, было бы полезно, если бы вы могли вместо этого объяснить, чего вы пытаетесь достичь

2. потому что мои реальные данные будут содержать 54 ключа, d а мои входные фреймы данных поступают из таблиц Excel. Элементы в df1 фактически будут представлять собой серию, извлеченную из таблиц Excel. Мой опубликованный вопрос максимально упрощен.

3. Я ищу способ применить логику к dfF

Ответ №1:

Если я вас правильно понял, все, что вам нужно, это обобщенный код, который может обрабатывать n количество ключей.

Этот фрагмент кода должен сделать свое дело

 tmp = pd.Series([], dtype=object)
keys = list(d.keys())
for i, cell in enumerate(df1.iterrows()):
    # d[keys[i]] contains a Dataframe 
    # cell[1] contains a series 
    # you append these together and then keep appending to an empty series 'tmp' 
    tmp = tmp.append(d[keys[i]].append(cell[1])) # updated
tmp.drop(columns=0, inplace=True)
#tmp.reset_index(drop=True, inplace=True)
print(tmp)
  

Вывод

        A
0  -1OX-
0     45
0  -1OY-
1     23
0  -1OZ-
2     76
  

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

1. это выглядит многообещающим только потому, что я получаю сообщение об ошибке list object is not callable для keys = list(d.keys())

2. убедитесь, что у вас нет переменной с именем list , это ключевое слово в python, и вы будете затенять его

3. это работает! Отлично, теперь я изучу код. Возможно, у меня будут вопросы позже. Спасибо!

4. Не могли бы вы объяснить, что конкретно делает эта строка for i, cell in enumerate(df.iterrows()): cell . Я не вижу, чтобы она вызывалась где угодно…

5. Вы могли бы заменить df1.loc[i] на cell . Должно быть, я забыл