【问题标题】:Access values in a dictionary of dataframes and create a new dataframe with certain columns in pandas访问数据框字典中的值并使用 pandas 中的某些列创建新数据框
【发布时间】:2020-07-28 07:06:16
【问题描述】:

这里是 Python 初学者。

我有一个数据框字典:

每个数据框对应不同的一天:

每天包含8列数据,我感兴趣-> ['WINDSPEED_wspd1[m/s]']

我想创建一个新变量(数据框),其中仅包含有关风速的数据,每天一列(数据框字典中的每个键)

我为此创建了一个函数

def get_variables(DictOfDataFrames, ColumnsToPlot, filenames):
     for key, df in DictOfDataFrames.items():  # Use magic unpacking to avoid multiple meteo_data[key]-call
    x=pd.DataFrame(index=range(0,86400,1),columns=filenames)

         if key in filenames:

             x[key]=df[ColumnsToPlot[0]][0:86400].copy()
             y=pd.DataFrame(DictOfDataFrames[key][ColumnsToPlot[1][0:86399]])
return xy
WindSpeed, WindDirection = get_variables(DATA_Meteo,['WINDSPEED_wspd1[m/s]','WINDDIR_wdir1[deg]'], filenames_Meteo[1:3])

但是,通过这种方式,我在每次迭代中都会覆盖 y,因此它会返回循环中最后一个文件名的值。另一方面,x 被返回为满是 NaN。

我尝试过插入、追加,我对此感到很疯狂,这应该是超级简单的代码。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我建议:

    • 创建一个空列表
    • 迭代字典并提取你想要的系列,将其添加到空列表中
    • 从此系列列表中创建一个数据框

    请找一个2天2列数据的例子:

        #%% Import lib
    
    import pandas as pd
    import numpy as np
    
    #%% Created  dummy of random data , one dataframe per day
    dataframe1 = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=['WINDSPEED_wspd1[m/s]','temp'])
    dataframe2 = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=['WINDSPEED_wspd1[m/s]','temp'])
    
    #created teh dummy dict
    dict_d ={"day1":dataframe1 , "day2":dataframe2}
    
    
    list_of_serie = []
    
    for key, value in dict_d.items():
        s = value['WINDSPEED_wspd1[m/s]']  #extract the serie you want
        s= s.rename(key) # change the change of teh serie by the day
    
        list_of_serie.append(s) # add in a list of serie
    
    # then concatenate all
    df = pd.concat(list_of_serie, axis=1) # concatenate this list of series
    
    print(df)
    

    【讨论】:

      【解决方案2】:

      我终于从另一个因类似问题而失去理智的用户那里找到了答案。

      def get_variables(DictOfDataFrames, ColumnsToPlot, filenames):
          first = True
          for key, value in DictOfDataFrames.items():
              if first:
                  x = pd.DataFrame(value[ColumnsToPlot[0]])
                  y = pd.DataFrame(value[ColumnsToPlot[1]])
                  first = False
              else:
                  x = x.merge(value[ColumnsToPlot[0]], left_index=True, right_index=True)
                  y = y.merge(value[ColumnsToPlot[1]], left_index=True, right_index=True)
      
          y.columns=DictOfDataFrames.keys() 
          x.columns=DictOfDataFrames.keys() 
          return x, y
      

      【讨论】:

        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        相关资源
        最近更新 更多