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

cpe*_*505 2 python function dataframe pandas

我对 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)**
Run Code Online (Sandbox Code Playgroud)

“宽”格式对我的练习并不是特别有帮助,因此我使用了 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')
Run Code Online (Sandbox Code Playgroud)

我的问题在于,我有多个文件需要以相同的格式导入,并且我不希望手动熔化每个数据帧。一个重要的警告是我更愿意将结果推送到新的唯一数据帧中(即上面的示例中 cityrentalprice1BR > cityrentalprice1BR_melt)。

我已经为此工作了一段时间,并创建了一个数据帧列表,并且可以将熔化函数应用到整个列表,如下所示,但是它缺少保留单独数据帧(或如果合并,则每个数据帧的列集)的关键目标函数更合适):

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'])
Run Code Online (Sandbox Code Playgroud)

任何指导将不胜感激。

Par*_*ait 8

通常,我在 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
Run Code Online (Sandbox Code Playgroud)

列表

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)
Run Code Online (Sandbox Code Playgroud)

字典

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)
Run Code Online (Sandbox Code Playgroud)

命名元组

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)
Run Code Online (Sandbox Code Playgroud)

单独的变量:(

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

cityrentalprice1BR_melt, cityrentalprice2BR_melt, cityrentalprice3BR_melt, \
cityrentalprice4BR_melt, cityrentalprice5BR_melt, \
cityrentalpriceCondo_melt, cityrentalpriceDupTri_melt = [melt_data(size) for size in Rental_list]
Run Code Online (Sandbox Code Playgroud)