首页 > 解决方案 > 通过一行和每个列名迭代数据框并为 bkoeh-heatmap 填充新数据框

问题描述

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

标签: pythonpandasdataframe

解决方案


我用这段代码解决了这个问题:

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

它有效,但我遇到了很大的性能问题。它运行了几个小时,但不会完成。


推荐阅读