为从字典调用的数据框添加后缀

时间:2017-10-27 20:19:07

标签: python python-3.x list pandas dictionary

我正在尝试为字典调用的数据帧添加后缀。

以下是示例代码:

import pandas as pd
import numpy as np
from collections import OrderedDict
from itertools import chain

# defining stuff
num_periods_1 = 11
num_periods_2 = 4
num_periods_3 = 5

# create sample time series
dates1 = pd.date_range('1/1/2000 00:00:00', periods=num_periods_1, freq='10min')
dates2 = pd.date_range('1/1/2000 01:30:00', periods=num_periods_2, freq='10min')
dates3 = pd.date_range('1/1/2000 02:00:00', periods=num_periods_3, freq='10min')

# column_names = ['WS Avg','WS Max','WS Min','WS Dev','WD Avg']
# column_names = ['A','B','C','D','E']
column_names_1 = ['C', 'B', 'A']
column_names_2 = ['B', 'C', 'D']
column_names_3 = ['E', 'B', 'C']

df1 = pd.DataFrame(np.random.randn(num_periods_1, len(column_names_1)), index=dates1, columns=column_names_1)
df2 = pd.DataFrame(np.random.randn(num_periods_2, len(column_names_2)), index=dates2, columns=column_names_2)
df3 = pd.DataFrame(np.random.randn(num_periods_3, len(column_names_3)), index=dates3, columns=column_names_3)

sep0 = '<~>'
suf1 = '_1'
suf2 = '_2'
suf3 = '_3'

ddict = {'df1': df1, 'df2': df2, 'df3': df3}
frames_to_concat = {'Sheets': ['df1', 'df3']}

Suffs = {'Suffixes': ['Suffix 1', 'Suffix 2', 'Suffix 3']}
Suff = {'Suffix 1': suf1, 'Suffix 2': suf2, 'Suffix 3': suf3}

## appply suffix to each data frame selected in order HERE
# Suffdict = [Suff[x] for x in Suffs['Suffixes']]
# print(Suffdict)

df4 = pd.concat([ddict[x] for x in frames_to_concat['Sheets']],
                axis=1,
                join='outer')

我想为每个数据帧添加一个后缀,以便在连接数据帧时可以区分它们。我在调用它们然后将它们应用于每个数据帧时遇到了一些麻烦。所以我要求连接df1和df3,我希望只将后缀1应用于df1,后缀2应用于df3。

如果df2和df3被调用,则顺序与数据帧后缀无关,后缀1将应用于df2,后缀2将应用于df3。显然不会使用最后一个后缀。

2 个答案:

答案 0 :(得分:1)

除非你有python3.6,否则你无法保证词典中的顺序。即使您可以使用python3.6,这也意味着您的代码不会在任何较低的python版本中运行。如果您需要订单,则应该查看列表。

您可以将数据框和后缀存储在列表中,然后使用/path/to/something依次为每个df添加后缀。

zip

根据您的代码/答案,您可以将数据框和后缀加载到列表中,调用dfs = [df1, df2, df3] sufs = [suf1, suf2, suf3] df_sufs = [x.add_suffix(y) for x, y in zip(dfs, sufs)] ,为每个列表添加后缀,然后调用zip

pd.concat

答案 1 :(得分:0)

结束为这个问题做一个简单的迭代器。这是我的解决方案

n=0   
for df in frames_to_concat['Sheets']:
        print(df_dict[df])
        df_dict[df] = df_dict[df].add_suffix(sep0 + suff[suffs['Suffixes'][n]])
        n = n+1

任何人都有更好的方法吗?