Позиционное форматирование строки на пандах DataFrame - PullRequest
0 голосов
/ 12 мая 2018

Я использую python для автоматизации некоторых процессов на работе.Мой конечный продукт должен быть в формате Excel (формулы должны быть там, и все должно быть отслеживаемо), поэтому я работаю над пандой DataFrame, а затем экспортирую результат в .xlsx.

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

  ID                          Price                       Quantity  Total
0  A  =VLOOKUP(A2;'Sheet2'!A:J;6;0)  =VLOOKUP(A2;'Sheet2'!A:J;7;0)  =B2*C2
1  B  =VLOOKUP(A3;'Sheet2'!A:J;6;0)  =VLOOKUP(A3;'Sheet2'!A:J;7;0)  =B3*C3
2  C  =VLOOKUP(A4;'Sheet2'!A:J;6;0)  =VLOOKUP(A4;'Sheet2'!A:J;7;0)  =B4*C4
3  D  =VLOOKUP(A5;'Sheet2'!A:J;6;0)  =VLOOKUP(A5;'Sheet2'!A:J;7;0)  =B5*C5
4  E  =VLOOKUP(A6;'Sheet2'!A:J;6;0)  =VLOOKUP(A6;’Sheet2'!A:J;7;0)  =B6*C6

Как видно из первой строки, формулы ссылаются на A2, B2 и C2;ссылки на второй ряд A3, B3 и C3;'n' строка ссылки A (n + 2), B (n + 2) и C (n + 2).DataFrame имеет около 3000 строк.

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

df = pd.DataFrame()
df['temp'] = range(3000)

df['Price'] = """=VLOOKUP(A{0};'Sheet2'!A:J;6;0)""" .format(df.index + 2)
df['Quantity'] = """=VLOOKUP(A{0};'Sheet2'!A:J;7;0)""" .format(df.index + 2)
df['Total'] = """=B{0}*C{0}""" .format(df.index + 2)

df.drop('temp', axis=1, inplace=True)

К сожалению, это не работает.Он возвращает что-то вроде этого:

 "=VLOOKUP(ARangeIndex(start=2, stop=3002, step=1);'Sheet2'!A:J;6;0)"

Кто-нибудь есть какие-либо предложения о том, как это сделать?

Спасибо!

1 Ответ

0 голосов
/ 12 мая 2018

Попробуйте векторизованную конкатенацию строк:

df = pd.DataFrame(index=range(2000)) # no need for temp here, btw

idx = (df.index + 2).astype(str)
df['Price'] = "=VLOOKUP(A" + idx + ";'Sheet2'!A:J;6;0)"

Аналогичный процесс выполняется для остальных ваших столбцов:

df['Quantity'] = "=VLOOKUP(A" + idx + ";'Sheet2'!A:J;7;0)"
df['Total'] = 'B' + idx + '*C' + idx

df.head()

                           Price                       Quantity  Total
0  =VLOOKUP(A2;'Sheet2'!A:J;6;0)  =VLOOKUP(A2;'Sheet2'!A:J;7;0)  B2*C2
1  =VLOOKUP(A3;'Sheet2'!A:J;6;0)  =VLOOKUP(A3;'Sheet2'!A:J;7;0)  B3*C3
2  =VLOOKUP(A4;'Sheet2'!A:J;6;0)  =VLOOKUP(A4;'Sheet2'!A:J;7;0)  B4*C4
3  =VLOOKUP(A5;'Sheet2'!A:J;6;0)  =VLOOKUP(A5;'Sheet2'!A:J;7;0)  B5*C5
4  =VLOOKUP(A6;'Sheet2'!A:J;6;0)  =VLOOKUP(A6;'Sheet2'!A:J;7;0)  B6*C6
...