使用循环使用 pandas 转换多个数据帧
Posted
技术标签:
【中文标题】使用循环使用 pandas 转换多个数据帧【英文标题】:Transforming multiple dataframes with pandas using a loop 【发布时间】:2019-08-03 10:15:26 【问题描述】:我目前正在做一个项目,我必须从一个 Excel 文件中进行一些转换和清理,该文件在每张表中都有相同的表,只是每张表代表不同的月份(表中的值不同)。
因此,将进行转换的代码仅对于不同的工作表是相同的。
df_at_jan = pd.read_excel("C:/Users/Spiros/Desktop/Reporting.xlsx",
sheet_name='Jan 2018')
df_at_feb = pd.read_excel("C:/Users/Spiros/Desktop/Reporting.xlsx",
sheet_name='Feb 2018')
df_at_jan.drop([0,1,2],axis=0)
df_at_jan.columns = df_at_jan.iloc[3]
df_at_feb.drop([0,1,2],axis=0)
df_at_feb.columns = df_at_feb.iloc[3]
当然,我必须在所有月份都这样做,我想知道如何使用 for 循环来做到这一点,以免为每个不同的月份重新创建代码。
我对 Python 非常陌生,因此非常感谢任何帮助。
非常感谢!
【问题讨论】:
【参考方案1】:我无法测试,因为你没有给出数据示例,但是根据this和this的答案,你可以试试:
xl = pd.ExcelFile('C:/Users/Spiros/Desktop/Reporting.xlsx')
sheets = xl.sheet_names
df_array = []
for sheet in sheets:
df_temp = pd.read_excel(xl , sheet)
df_temp = df_temp.drop([0,1,2],axis=0)
df_temp.columns = df_temp.iloc[3]
df_array.append(df_temp)
每个月的数据都会在数组的某个位置。
如果您需要将所有数据变成单个 DataFrame,请执行以下操作:
df = pd.concat(df_array, ignore_index = True)
【讨论】:
【参考方案2】:1) 创建函数
def read_one_month(sheet_name):
df = pd.read_excel("C:/Users/Spiros/Desktop/Reporting.xlsx",
sheet_name=sheet_name)
df.drop([0,1,2],axis=0, inplace = True)
return df
2) 定义工作表名称数组并运行循环:
df = pd.DataFrame(None)
for sheet_name in ['Jan 2018','Feb 2018']:
df = pd.concat([df, read_one_month(sheet_name)], axis = 0, ignore_index = True)
【讨论】:
以上是关于使用循环使用 pandas 转换多个数据帧的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python3 将 Bytes 对象转换为 Pandas 数据帧会产生一个空数据帧。为啥?
Pandas:使用循环和分层索引将多个 csv 文件导入数据帧
将 pandas 数据帧转换为 json 对象 - pandas