将函数应用于多个数据框,返回多个DF作为输出

时间:2018-08-14 16:14:50

标签: python pandas function dataframe

我对python还是比较陌生,但是一直在研究一个关注住房市场的宠物项目。实际上,我已经读取了一系列文件,并以原始格式将它们存储为变量,如下所示:

**
cityrentalprice1BR.columns

Index([u'RegionName', u'State', u'Metro', u'CountyName', u'SizeRank',
   u'2010-02', u'2010-03', u'2010-04', u'2010-05', u'2010-06',
   ...
   u'2017-09', u'2017-10', u'2017-11', u'2017-12', u'2018-01', u'2018-02',
   u'2018-03', u'2018-04', u'2018-05', u'2018-06'],
  dtype='object', length=106)**

“宽”格式对我的锻炼没有特别帮助,因此我使用了melt函数来按城市划分更好的时间序列,并且在单个数据帧上的效果很好:

cityrentalprice1BR_melt = pd.melt(cityrentalprice1BR, id_vars=['RegionName', 'State', 'Metro', 'CountyName', 'SizeRank'], 
            value_vars = dates, 
            value_name = 'Value',
            var_name =['Date'])


cityrentalprice1BR_melt['Date'] = pd.to_datetime(cityrentalprice1BR_melt['Date'], format='%Y-%m')

我的问题出现了,因为我有多个文件要以相同的格式导入,而我宁愿不手动融化每个数据框。一个重要的警告是,我希望将结果推送到新的唯一数据帧中(即在上例中,cityrentalprice1BR> cityrentalprice1BR_melt)。

我已经研究了一段时间,并创建了一个数据框列表,并且可以将melt函数应用于整个列表,如下所示,但是它缺少我保留单独数据框(或每个数据框的列集)的主要目标如果合并功能更合适):<​​/ p>

Rental = [cityrentalprice1BR, cityrentalprice2BR, cityrentalprice3BR, cityrentalprice4BR, cityrentalprice5BR, cityrentalpriceCondo, cityrentalpriceDupTri]
for size in Rental:
transformrent = pd.melt(size, id_vars=['RegionName', 'State', 'Metro', 'CountyName', 'SizeRank'], 
            value_vars = dates, 
            value_name = 'Value',
            var_name =['Date'])

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:2)

我通常建议在Pandas和R中始终使用许多相似对象的单个集合,而不要用单独的变量来填充全局环境。这使您可以管理一个大对象,而不用开放式计数来管理许多您可能会忘记的名称。想象一下浏览10,000个数据帧!最好浏览一个列表的10,000个索引或一本字典的10,000个键。

如果将元素存储在列表,字典甚至命名的元组中,则DataFrame的零功能将丢失。另外,如果您需要在所有程序上运行操作,则可以使用一个容器来进行此类操作。下面显示了融化数据帧的各种集合(使用定义的函数)的构建,并演示了DataFrame方法甚至pd.concat之类的批量操作。

功能

def melt_data(df):   
     mdf = pd.melt(df, id_vars=['RegionName', 'State', 'Metro', 'CountyName', 'SizeRank'], 
                   value_vars = dates, value_name = 'Value', var_name = 'Date')
     return mdf

列表

Rental_list = [cityrentalprice1BR, cityrentalprice2BR, cityrentalprice3BR, cityrentalprice4BR, 
               cityrentalprice5BR, cityrentalpriceCondo, cityrentalpriceDupTri]

# LIST COMPREHENSION
df_list = [melt_data(size) for size in Rental_list]

df_list[0].shape()
df_list[1].head()
df_list[2].tail()
df_list[3].sum()
df_list[4].mean()

# APPEND ALL
master_df = pd.concat(df_list, ignore_index)

词典

Rental_dict = {'1BR': cityrentalprice1BR, '2BR': cityrentalprice2BR, '3BR': cityrentalprice3BR, 
               '4BR': cityrentalprice4BR, '5BR': cityrentalprice5BR,
               'Condo': cityrentalpriceCondo, 'DupTri': cityrentalpriceDupTri}

# DICTIONARY COMPREHENSION
df_dict = {i+'_melt': melt_data(size) for i, size in Rental_dict.items()}

df_dict['1BR_melt'].shape()
df_dict['2BR_melt'].head()
df_dict['3BR_melt'].tail()
df_dict['Condo_melt'].sum()
df_dict['DupTri_melt'].mean()

# APPEND ALL
master_df = pd.concat(df_dict, ignore_index)

命名元组

from collections import namedtuple

melt_dfs = namedtuple('melt_dfs', 'OneBR TwoBR ThreeBR FourBR FiveBR Condo DupTri')

df_tuple = melt_dfs(*[melt_data(size) for size in Rental_list])
# df_tuple = melt_dfs(*[melt_data(size) for i, size in Rental_dict.items()])

df_tuple.OneBR.shape()
df_tuple.TwoBR.head()
df_tuple.ThreeBR.tail()
df_tuple.FourthBR.sum()
df_tuple.FourthBR.mean()

# APPEND ALL
master_df = pd.concat(df_tuple, ignore_index=True)

独立变量:(

尽管如此,如果您确实确实需要单独的对象,只需从融化的数据帧列表中解压缩即可:

cityrentalprice1BR_melt, cityrentalprice2BR_melt, cityrentalprice3BR_melt, \
cityrentalprice4BR_melt, cityrentalprice5BR_melt, \
cityrentalpriceCondo_melt, cityrentalpriceDupTri_melt = [melt_data(size) for size in Rental_list]