【问题标题】:Column names after transposing a dataframe转置数据框后的列名
【发布时间】:2020-01-30 21:29:51
【问题描述】:

我有一个小型数据框 - 六行(不包括标题)和 53 列(商店名称,以及过去一年的其余每周销售额)。每行包含一个特定的商店,每列包含商店的名称和每周的销售额。我需要转置数据,使周显示为行,商店显示为列,而它们的销售额显示为行。

生成输入数据:

df_store = pd.read_excel(SourcePath+SourceFile, sheet_name='StoreSales', header=0, usecols=['StoreName'])
# Number rows of all irrelevant stores.
row_numbers = [x+1 for x in df_stores[(df_store['StoreName'] != 'Store1') & (df_store['StoreName'] != 'Store2')
 & (df_store['StoreName'] !='Store3')].index]

# Read in entire Excel file, skipping the rows of irrelevant stores.
df_store = pd.read_excel(SourcePath+SourceFile, sheet_name='StoreSales', header=0, usecols = "A:BE", 
    skiprows = row_numbers, converters = {'StoreName' : str})

# Transpose dataframe
df_store_t = df_store.transpose()

我的输出将索引号放在每个商店名称上方(0 到 5),然后每列以 StoreName(一周以上)开始,然后是每个商店名称。然而,我不能通过他们的名字来操纵他们。

有没有办法清除这些索引号,以便我可以直接使用生成的列名(例如,将“StoreName”重命名为“WeekEnding”并引用每个存储列(“Store1”、“Store2”、等等?)

【问题讨论】:

标签: pandas dataframe transpose


【解决方案1】:

IIUC,你需要先set_index,然后转置,T

看这个例子:

df  = pd.DataFrame({'Store':[*'ABCDE'],
                    'Week 1':np.random.randint(50,200, 5), 
                    'Week 2':np.random.randint(50,200, 5),
                    'Week 3':np.random.randint(50,200, 5)})

输入数据框:

  Store  Week 1  Week 2  Week 3
0     A      99     163     148
1     B     119      86      92
2     C     145      98     162
3     D     144     143     199
4     E      50     181     177

现在,设置索引和转置:

df_out = df.set_index('Store').T
df_out

输出:

Store     A    B    C    D    E
Week 1   99  119  145  144   50
Week 2  163   86   98  143  181
Week 3  148   92  162  199  177

【讨论】:

  • 谢谢斯科特。这当然照顾了商店名称部分。我希望的是 Week-Ending 日期栏成为我可以称之为 WeekEnding 的栏。因此,在我的原始数据框中,我有一个名为 Sales2018/01/06 的列,另一个名为 Sales2018/01/13 的列,依此类推,为期 52 周。我怎样才能将它们变成一个名为“WeekEnding”的列,因为我还想从中剥离“Sales”并将它们转换为日期值以进行操作。再次感谢!
  • @AJCaffarini 在 .T. 之后添加 .reset_index()。您能否将代码添加到您的问题中,生成一小部分输入数据框并显示您的预期输出。
  • Scott,我添加了用于从 Excel 导入的代码。我不确定如何描述我的预期输出。我也为此使用 CTRL-K 吗?
  • @AJCaffarini 不是我在说什么。您应该创建将创建输入数据的小型测试样本的代码,以便我们可以复制您的输入,然后还提供此测试样本的预期输出。请注意,在我的回答中,我是如何创建这个虚拟测试集的,您可以采用同样的方式来包含您的问题,例如使用 Sales 和周末进行标记。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多