pandas DataFrame上的位置字符串格式

时间:2018-05-12 15:22:13

标签: python pandas dataframe string-formatting

我正在使用python来自动处理某些流程。我的最终产品必须是excel格式(公式必须在那里,一切都必须是可追踪的),所以我处理一个pandas DataFrame,然后将结果导出到.xlsx

我想要做的是创建一个如下所示的pandas 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有大约3.000行。

我想用几行代码生成这个数据帧,但我没有得到预期的结果。我虽然使用位置格式会做:

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 :(得分:1)

尝试矢量化字符串连接:

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