我正在遍历下面的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()
答案 0 :(得分:1)
它保存所有值,每次都只是覆盖上一次迭代的输出。
有几种可能的解决方案。您可以通过在每次迭代中附加到数据框来聚合结果,在excel中更新您的位置并在下一次迭代中将其作为to_excel的start_row传递,您可以通过更改文件名生成多个excel,可能还有很多其他选项。
答案 1 :(得分:1)
有很多方法可以做到这一点。我可以建议......而不是在DataFrame的每一行上循环,尝试joining或merging吗?
merged_data = data_REF.merge(data_PCU, on=['Timestamp'], l_suffix='', r_suffix='PCU')
以上内容data_REF
和data_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'])