如何使用pandas从csv读取一行,继续执行VLOOKUP操作并将结果保存到另一个文件中?

时间:2018-01-20 18:56:34

标签: python python-2.7 csv dataframe

从这个question开始,我找到了如何使用pandas来进行VLOOKUP。 所以,正如jezrael建议的那样,我这样做了:

df1 = pd.read_csv('df1.csv', names=['a','b'])
print (df1)
              a         b
0          Time  07:03:52
1    EmployeeID     98766
2  EmployeeName      Joao
3          Time  08:03:52
4    EmployeeID     98765
5  EmployeeName      Mary

#for columns names created from file2
df2 = pd.read_csv('df2.csv')
c = df2.columns.str.strip().tolist()
print (c)
['EmployeeID', 'EmployeeName', 'Time']

#or defined in list
#c = ['Time', 'EmployeeID', 'EmployeeName']

g = df1.groupby('a').cumcount()
df1 = df1.set_index([g,'a'])['b'].unstack().reindex(columns=c)
print (df1)

我知道了:

a EmployeeID EmployeeName      Time
0      98766         Joao  07:03:52
1      98765         Mary  08:03:52

现在,我想了解如何获取一个.csv文件,其中包含df1的所有信息,而不是2列,并将其转换为2列的临时文件,所以我可以阅读它并继续VLOOKUP到df3。如下例所示:

现在,假设 df1.csv df2.csv 还有其他值:

df1.csv

Symbol, A;Goal,1.07;Range,0.72 - 1.07;Return over time,15.91%;;
Symbol, B;Goal,1.06;Range,0.5 - 1.32;Return over time,9.91%;Maturity,5;Total,13.555

df2.csv

Return_over_time,Maturity,Symbol,Goal,Range,Total

我希望得到与上面相同的结果,但是从df1的每一行获取信息。所以我可以得到这个结果:

df3.csv

Symbol  Return_over_time   Goal   Range        Maturity   Total
A       15.91%             1.07   0.72 - 1.07
B       9.91%              1.06   0.5 - 1.32   5          13.555  

谢谢!

1 个答案:

答案 0 :(得分:1)

首先创建DataFrame - header=None表示没有csv标题:

df1 = pd.read_csv('df1.csv', sep=';',header=None)

stack重新定位到Seriessplit正则表达式'\s*,\s*表示逗号之间有双零或更多空格:

df1 = df1.stack().str.split('\s*,\s*', expand=True)
print (df1)
                    0            1
0 0            Symbol            A
  1              Goal         1.07
  2             Range  0.72 - 1.07
  3  Return over time       15.91%
1 0            Symbol            B
  1              Goal         1.06
  2             Range   0.5 - 1.32
  3  Return over time        9.91%
  4          Maturity            5

reset_index删除第二级并添加新级别 set_index,最后通过unstack重新塑造:

df1 = df1.reset_index(level=1, drop=True).set_index(0, append=True)[1].unstack()
print (df1)
0  Goal Maturity        Range Return over time Symbol   Total
0  1.07     None  0.72 - 1.07           15.91%      A    None
1  1.06        5   0.5 - 1.32            9.91%      B  13.555