遍历每一行和每个列名遍历一个数据框,并为bkoeh-heatmap填充新的数据框

时间:2019-04-30 11:58:51

标签: python pandas dataframe

我已经使用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的新手,所以没有按预期工作。

1 个答案:

答案 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

它可以工作,但是我遇到了很大的性能问题。 它运行了几个小时,但还没有完成。

我们对改善性能的任何帮助表示赞赏。