python-3.x 从同一个电子表格中提取多个表并将它们合并以获得一个连续的数据框

mw3dktmi  于 2022-12-05  发布在  Python
关注(0)|答案(3)|浏览(92)

我有一个Spreadsheet of Time series Data
它为每一年都有单独的表格,表格之间有一个单独的行间隔。我想把表格标题中的年份作为日期列的一部分。这样我就可以绘制图表,并对数据(年环比)等进行简单的比较

import pandas as pd

RigCountWorld_df = pd.read_excel(open('Worldwide Rig Count Nov 2022.xlsx', 'rb'),
              sheet_name='Worldwide_Rigcount',index_col=None, header=6)

RigCountWorld_df

我的代码没有任何帮助,甚至我需要使用的Pandas操作的名称对我也有帮助。
我需要一个连续的表,其中包含所有年份的数据。最后有最新的数据是有意义的。
甚至单独转置表并将它们作为新列添加也是有意义的(列标题包含年-月名称)。

ql3eal8s

ql3eal8s1#

下面是一个命题,其中包含一些pandas * 内置 * 函数。

import pandas as pd

df = pd.read_excel("Worldwide Rig Count Nov 2022.xlsx",
                   sheet_name="Worldwide_Rigcount", header=None, usecols="B:K", skiprows=6)
    ​
df.dropna(how="all", inplace=True)
df.insert(0, "Year", np.where(df[10].eq("Total World"), df[1], None))
df["Year"].ffill(inplace=True)
df.drop_duplicates(subset= df.columns[2:], inplace=True)
df.columns = ["Year", "Month"] + df.loc[0, 2:].tolist()
df = df.loc[1:, :].reset_index(drop=True)
输出:
print(df.sample(5).to_string())
​
     Year Month Latin America Europe Africa Middle East Asia Pacific Total Intl. Canada  U.S. Total World
613  1975   Mar           310    113    122         173          208         926    192  1651        2769
588  1977   Apr           324    135    165         185          167         976    129  1907        3012
596  1977   Dec           353    142    172         195          182        1044    259  2141        3444
221  2005   Jan           307     57     50         242          204         860    550  1255        2665
566  1979   Aug           440    149    199         144          219        1151    376  2222        3749
检查:
  • 48年,每年13行(12个月+平均值)*。
print(df.groupby("Year").size().value_counts())

13    48
dtype: int64
iqih9akk

iqih9akk2#

您可以使用pandas melt()函数将数据从宽格式调整为长格式,以便每行包含一个观测值。然后,您可以使用pandas concat()函数将每个工作表中的融合 Dataframe 连接到一个 Dataframe 中。
若要将工作表标题中的年份添加到日期列中,可以使用pandas assign()函数创建一个新列,其中包含工作表名称中的年份。然后,使用pandas datetime.strptime()函数将现有的日期列转换为日期时间对象,其中包含新列中的年份。
下面是一个示例:

import pandas as pd

# create a list of sheet names
sheets = ['Worldwide_Rigcount_2020', 'Worldwide_Rigcount_2021', 'Worldwide_Rigcount_2022']

# create an empty list to store the dataframes
dfs = []

# loop through each sheet
for sheet in sheets:
    # read the sheet into a dataframe
    df = pd.read_excel('Worldwide Rig Count Nov 2022.xlsx', sheet_name=sheet, index_col=None, header=6)
    
    # extract the year from the sheet name
    year = int(sheet.split('_')[-1])
    
    # melt the dataframe from wide to long format
    df_melted = df.melt(id_vars=['Date'])
    
    # add the year from the sheet name to the dataframe
    df_melted = df_melted.assign(year=year)
    
    # convert the date column to datetime objects
    df_melted['Date'] = pd.to_datetime(df_melted['Date'], format='%b %Y', errors='coerce').dt.strftime('%Y-%m-%d') + '-' + df_melted['year'].astype(str)
    
    # append the dataframe to the list
    dfs.append(df_melted)
    
# concat the list of dataframes into a single dataframe
df_final = pd.concat(dfs)

# print the final dataframe
print(df_final)
bgibtngc

bgibtngc3#

验证年份和月份内容的另一个解决方案(假定列名位于RigCountWorld_df的第一行):

df = RigCountWorld_df.copy()
first_col = 2  # First column with data
column_names = df.iloc[0, first_col:].to_list()
df["Year"] = df.iloc[:,[1]].where(df.iloc[:,1].astype(str).str.match(r"^20\d\d$"), None).ffill()
df["Month"] = df.iloc[:,[1]].where(df.iloc[:,1].astype(str).isin(("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")), None)
df = df[df['Month'].notna()]
df = df.iloc[:, first_col:].set_index(["Year", "Month"])
df.columns = column_names
df

相关问题