【问题标题】:Add a suffix to a dataframe called from a dictionary向从字典调用的数据框添加后缀
【发布时间】:2017-10-27 20:19:07
【问题描述】:

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

下面是一个示例代码:

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,则数据框后缀的顺序无关紧要,后缀 1 将应用于 df2,而后缀 2 将应用于 df3。显然最后一个后缀不会被使用。

【问题讨论】:

  • 快速挑剔:您已将您的听写保存在字典中。所以,不可能给它们加上后缀...
  • 会有更好的存储方式吗?也许是一个列表?什么会让他们更容易按顺序申请?
  • 是的,我在回答中输入了一些解释。

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


【解决方案1】:

除非你有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')

【讨论】:

  • 我认为 zip 可能是这里的关键。我想我必须将字典中的内容发送到列表中才能使用它。不幸的是,我无法使用字典。
  • @MooseDrool 当心,你已被警告 :)
【解决方案2】:

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

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

谁有更好的方法来做到这一点?

【讨论】:

猜你喜欢
  • 2022-12-18
  • 2020-02-24
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2022-01-17
  • 2021-11-24
相关资源
最近更新 更多