对于pandas中的循环,DataFrame数据仅将最后一次迭代保存到excel文件

时间:2018-01-24 14:30:55

标签: python pandas for-loop dataframe

我正在遍历下面的DataFrame数据的行,并检查是否例如列Power中的值> 0然后我想将这些数据导出到excel文件中。这也有效,但它只写了excel文件中的最后一次迭代,我得出的结论是我需要以某种方式使用append函数,但我无法弄清楚如何让它工作。

1.  Location    UnitName    Timestamp           Power        Windspeed   Yaw
2.  Bull Creek  F10         01/11/2014 00:00:00 7,563641548  3,957911002 280,5478821     
3.  Bull Creek  F10         01/11/2014 00:20:00 60,73444748  4,24157236  280,4075012
4.  Bull Creek  F10         01/11/2014 00:30:00 63,15441132  4,241089859 280,3903809
5.  Bull Creek  F10         01/11/2014 00:40:00 59,09280396  4,38904965  280,4152527
6.  Bull Creek  F10         01/11/2014 00:50:00 69,26197052  4,374599175 280,3750916
7.  Bull Creek  F10         01/11/2014 01:00:00 101,0624237  5,343887005 280,5173035
8.  Bull Creek  F10         01/11/2014 01:10:00 122,7936935  5,183885235 280,4681702
9.  Bull Creek  F10         01/11/2014 01:20:00 86,57110596  5,046733923 280,3834534     
10. Bull Creek  F10         01/11/2014 01:40:00 16,74042702  3,024427626 280,1408386
11. Bull Creek  F10         01/11/2014 01:50:00 12,5870142   2,931351769 280,1185913
12. Bull Creek  F10         01/11/2014 02:00:00 -1,029753685 3,116549245 279,9686279
13. Bull Creek  F10         01/11/2014 02:10:00 13,35998058  3,448055706 279,8687134
14. Bull Creek  F10         01/11/2014 02:20:00 17,42461395  2,943588415 280,1383057
15. Bull Creek  F10         01/11/2014 02:30:00 -9,614940643 2,744164819 280,6514893   
16. Bull Creek  F10         01/11/2014 02:50:00 -11,01966286 3,554833538 283,1451416
17. Bull Creek  F10         01/11/2014 03:00:00 -4,383010387 4,279259377 283,3281555


import pandas as pd
import os

os.chdir('C:\Users\NIK\.spyder2\PythonScripts')

fileREF = 'FilterDataREF.xlsx'

dataREF = pd.read_excel(fileREF, sheetname='Sheet1')

filePCU = 'FilterDataPCU.xlsx'

dataPCU = pd.read_excel(filePCU, sheetname='Ark1')

for i in range(len(dataREF)):
    for j in range(len(dataPCU)):
      if dataREF['Timestamp'][i] == dataPCU['Timestamp'][j] and dataREF['Power'][i] > 0 and dataPCU['Power'][j] > 0:

    data_REF = pd.DataFrame([dataREF.loc[i]])
    data_PCU = pd.DataFrame([dataPCU.loc[j]])

    writer = pd.ExcelWriter('common_data.xlsx', engine='xlsxwriter')
    # Convert the dataframe to an XlsxWriter Excel object.
    data_REF.to_excel(writer, sheet_name='Sheet1')
    data_PCU.to_excel(writer, sheet_name='Sheet1', startcol=7)

    writer.save()

2 个答案:

答案 0 :(得分:1)

它保存所有值,每次都只是覆盖上一次迭代的输出。

有几种可能的解决方案。您可以通过在每次迭代中附加到数据框来聚合结果,在excel中更新您的位置并在下一次迭代中将其作为to_excel的start_row传递,您可以通过更改文件名生成多个excel,可能还有很多其他选项。

答案 1 :(得分:1)

有很多方法可以做到这一点。我可以建议......而不是在DataFrame的每一行上循环,尝试joiningmerging吗?

merged_data = data_REF.merge(data_PCU, on=['Timestamp'], l_suffix='', r_suffix='PCU')

以上内容data_REFdata_PCU在字段Timestamp上。我这样做是因为我看到你的代码中有dataREF['Timestamp'][i] == dataPCU['Timestamp'][j]。请注意,l_suffix=''表示data_PCF中类似命名的data_REF中的任何列都将保留。同时,类似于data_PCU命名的列将_PCU添加到后缀中。所以以Timestamp_PCU为例

一旦合并了DataFrame,您就可以开始执行类似

的操作了
pow_gt_zero = (merged_data['Power'] > 0) & (merged_data['Power_PCU'] > 0)
valid_df = merged_data.loc[pow_gt_zero]

使用上面的.loc,您将获得满足条件pow_gt_zero的DataFrame的子集。

现在您拥有符合条件的行,您可以再次引用这些时间戳。您可以使用它们对原始DataFrame进行子集化,以便您可以将它们写入Excel。

data_REF = data_REF.loc[data_REF['Timestamp'].isin(valid_df['Timestamp'])
data_PCU = data_PCU.loc[data_PCU['Timestamp'].isin(valid_df['Timestamp'])