我已经使用pd.read_csv读取了一个csv文件,并创建了一个新的数据框,在第一列中具有采样时间,在以下列名称中具有位置名称。 现在,我想根据采样时间和位置名称填写csv_read中的值。
read_csv数据帧(df):
Index Location Description .... Sample Time ... Value
0 Location_1_100 .... 2018-12-13 00:30:00 ... 0.45
1 Location_1_101 .... 2018-12-13 00:30:00 .... 0.33
准备填充数据框(主数据):
Index Sample Time Location_1_100 Location_1_101 ...
0 2018-12-13 00:30:00 Value from df Value from df
1 2018-12-13 01:00:00 Value from df Value from df
import csv
import numpy as np
import pandas as pd
df = pd.read_csv(remove_bom('file.csv'), parse_dates=['Sample Time'])
df['Sample Time'] = df['Sample Time'].dt.round('30min')
sensoren = df.drop_duplicates('Location Description')
master = pd.DataFrame(data={'Sample Time':df['Sample Time']})
master = master.drop_duplicates()
master = master.reindex(columns=master.columns.tolist()+sensoren['Location Description'].tolist())
for ind, column in enumerate(master.columns[1:]):
master[column][ind]=df.loc[(df['Location Description'] == column)&(df['Sample Time'] == master['Sample Time'][ind])
此代码应填充master中df中的值,但仅填充第一个位置的第一个采样时间,第二个位置的第二个采样时间,等等。
我还尝试了一些嵌套的for循环,但是由于我是python的新手,所以没有按预期工作。
答案 0 :(得分:0)
我用以下代码解决了这个问题:
i=0
#Put columns in list
columns=master.columns.tolist()
#Delete "Sample Time"
del columns[0]
#Remove strange indices
master=master.reset_index(drop=True)
#Iterate through columns
for y in columns:
#Iterate through times
for x in master.loc[:,'Sample Time']:
#Check if a value was found (needed for iloc)
if not ((df.loc[(df['Location Description'] == y)&(df['Sample Time'] == x), 'Value']).empty):
#Copy value to master, if there are multiple values take the first
master.loc[i,y]=(df.loc[(df['Location Description'] == y)&(df['Sample Time'] == x), 'Value']).iloc[0]
#Delete used row in df to improve performance
df=df.drop(df.index[(df['Location Description'] == y)&(df['Sample Time'] == x)])
i+=1
#Reset index when moving to next column
i=0
它可以工作,但是我遇到了很大的性能问题。 它运行了几个小时,但还没有完成。
我们对改善性能的任何帮助表示赞赏。