pandas:循环遍历多个数据帧以提高效率

时间:2018-03-30 17:45:19

标签: python pandas for-loop

我只是在学习使用Jupyter笔记本的熊猫。我有10个数据集,包含不同年份的日常温度。但是,日期分为几个月,几天和几年的不同列,并且在不同的列中显示温度。原始数据在列名称中有空格。例如,df1info()的信息如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17301 entries, 0 to 17300
Data columns (total 4 columns):
agno      17301 non-null int64
mes      17301 non-null int64
dia      17301 non-null int64
valor    17301 non-null float64
dtypes: float64(1), int64(3)
memory usage: 540.7 KB

我确实编写了以下代码,在检查了这个社区中的不同解决方案之后执行这项工作,我想知道一种更有效和更好的方法。

list_df = [df1,df2,df3,df4,df5,df6,df7,df8,df9,df10]
for i, df in enumerate(list_dfs):
df = list_df[i]
df = df.rename(columns=lambda x: x.strip())
df['mes'] = df['mes'].astype(str)
df['dia'] = df['dia'].astype(str)
df['combined']=df['agno'].astype(str) + "-" + df["mes"] + "-" + df["dia"]
df["date"]= pd.to_datetime(df["combined"])
df = df[['date','valor']]
list_df[i] = df
i = i + 1

感谢您的帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

我认为它可能会被concat缩小,这将创建多个索引数据框,您可以使用合并数据框进行这些调整,然后只需groupby key (此处为level = 0)并将这些单个df拆分为您想要的新列表

s=pd.concat(list_df,keys=list(range(len(list_df))))

s = s.rename(columns=lambda x: x.strip())
s['mes'] = s['mes'].astype(str)
s['dia'] = s['dia'].astype(str)
s['combined']=s['agno'].astype(str) + "-" + s["mes"] + "-" + s["dia"]
s["date"]= pd.to_datetime(s["combined"])
s = s[['date','valor']]


list_df=[d for _,d in s.groupby(level=0)]

答案 1 :(得分:3)

我这样做:

def f(df):
    df['date'] = (pd.to_datetime(
                    df.rename(
                        columns={'agno':'year', 'mes':'month', 'dia':'day'})
                    [['year','month','day']]))
    return df.drop([['year','month','day']], axis=1)

df = pd.concat([f(x) for x in list_df], ignore_index=True)