【问题标题】:How to merge a list composed of many variables and a DataFrame in a single Python Dataframe?如何在单个 Python Dataframe 中合并由多个变量和 DataFrame 组成的列表?
【发布时间】:2019-11-26 11:52:19
【问题描述】:

我创建了一个名为“list_data”的列表,其中包含来自许多文件的变量。我还有一个名为“observation_data”的数据框。 我正在尝试将这两个文件与关键的“时间”合并,但无事可做,我所有的尝试都失败了。这是我的代码和结果

path = "v9/As CA-Previsions-"
path_previsions = ["D S.csv", "Map.csv", "We.csv", "Wu.csv"]
path_observations = "v9/As CA-Observations.csv"

def get_forecast(path, path_previsions, path_observations):
    list_data = []
    for forecaster in path_previsions:
        dataframe = pd.read_csv(path + forecaster, sep=";").dropna(subset=["temperature"]).dropna()
        dataframe["time"] = pd.to_datetime(dataframe['time'], format='%d-%m-%Y %H:%M:%S')
        dataframe.sort_values(by=['time'])
        dataframe['time'] = dataframe['time'].apply(lambda x: x.replace(minute=0, second=0)) #Conserve just hour
        dataframe = dataframe.groupby(['time']).mean()
        dataframe.columns = [x + "_" + forecaster.split('.')[0] for x in dataframe.columns]
        list_data.append(dataframe)   

    observation_data = pd.read_csv(path_observations, sep=";", index_col=False).drop(columns=["station"]).dropna()
    observation_data["time"] = pd.to_datetime(observation_data['time'], format='%d-%m-%Y %H:%M:%S')
    observation_data.sort_values(by='time')
    observation_data['time'] = observation_data['time'].apply(lambda x: x.replace(minute=0, second=0))
    observation_data = observation_data.groupby(['time']).mean()
    observation_data=observation_data.rename(index=str, columns={"humidity": "humidity_Y", "precipitation": "precipitation_Y", "temperature":"temperature_Y"})

    return list_data, observation_data

我已经试过了:

list_data, observation_data = get_forecast(path, path_previsions, path_observations)
X = pd.concat(list_data, axis=1, join='inner')
Y = observation_data
df_forcast_cap = pd.concat([X,Y], axis=1, join='inner')

返回一个0行35列的元素

我也试过了:

X = [list_data]
X = pd.merge(X, how='inner')

也没有成功: 类型错误:merge() 缺少 1 个必需的位置参数:'right'

在merge和concact试探之前,我的list_data和observation_data都不为空,这里举个例子:

list_data : (列表)

[[                                 cl_co_D S        hu_D S  \
time                                                           
2019-02-20 12:00:00                  0.00          58.000000   
2019-02-20 13:00:00                  0.00          55.000000   
2019-02-20 14:00:00                  0.00          53.000000

observation_data : (pandas.core.frame.DataFrame)

                    humidity_Y      precipitation_Y  temperature_Y
time                                                           
2019-02-28 10:00:00   61.000000              0.0      16.125000
2019-02-28 11:00:00   45.250000              0.0      19.925000

我也尝试将我的列表转换为数据框:

X = pd.DataFrame(list_data) 
print(X)

但我得到的东西根本不好:

                                                   0
0                       cloud_cover_Dark Sky  hum...
1                       cloud_cover_OpenWeatherMa...
2                       cloud_cover_Weatherbit  h...
3                       cloud_cover_Wunderground ...

我可以将这个列表和数据框合并在一起吗?

【问题讨论】:

  • 我终于得到了解决方案:之前,我一起运行了以下几行:list_data,observation_data = get_forecast(path, path_previsions, path_observations) X = pd.concat(list_data, axis=1, join=' inner') Y = observation_data df_forcast_cap = pd.concat([X,Y], axis=1, join='inner') 所以我尝试在第一次运行前 3 行,然后在另一个 Jupiter 笔记本中运行“块”我跑了其他行,我得到了想要的结果。所以我的错误只是将所有这些行同时运行。
  • 我还将“X = pd.concat(list_data, axis=1, join='inner')”更改为“df_forcast_cap = pd.merge(X, Y, right_index=True, left_index =True)" 一切正常

标签: python pandas datetime merge concatenation


【解决方案1】:

如果list_data 是pandas 数据框的列表,您可以使用pd.concat 将它们全部连接成一个数据框。使用axis=0 沿行轴连接,或使用axis=1 沿列轴连接。

all_list_data = pd.concat(list_data, axis=...)

This guide 也可能对你有用。

【讨论】:

  • 这正是我第一次使用的东西,结果很奇怪:一个 0 行 35 列的元素。但是我检查了我的列表和数据框,它们根本不是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2016-01-17
  • 2016-01-21
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多