向从字典调用的数据帧添加后缀



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

下面是一个示例代码:

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。 显然不会使用最后一个后缀。

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

可以将数据帧和后缀存储在列表中,然后使用 zip 依次为每个 df 添加后缀。

dfs = [df1, df2, df3]
sufs = [suf1, suf2, suf3]
df_sufs = [x.add_suffix(y) for x, y in zip(dfs, sufs)]

根据您的代码/答案,您可以将数据帧和后缀加载到列表中,调用zip,为每个后缀添加后缀,然后调用pd.concat

dfs = [ddict[x] for x in frames_to_concat['Sheets']]
sufs = [suff[x] for x in suffs['Suffixes']]
df4 = pd.concat([x.add_suffix(sep0 + y) 
          for x, y in zip(dfs, sufs)], axis=1, join='outer')

最终只是为这个问题制作一个简单的迭代器。这是我的解决方案

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

有人有更好的方法吗?

最新更新