Python &引用;标签[5]不在[索引]中;在复制行时

Python &引用;标签[5]不在[索引]中;在复制行时,python,pandas,Python,Pandas,我正在尝试重新格式化CSV,将每个月的列转换为每个记录的单独行(基本上是旋转),即: 进入: 为此,我认为最好的方法是: 循环浏览每一行,循环浏览每个月列(Jan-17,Feb-17,等等),然后复制该行 然后将月份和总计插入日期和总计列 然后删除重复的记录并从索引停止的位置开始(即,在每个日期的5个记录循环之后,开始的索引将是5) 然后,当所有行都被复制时,删除月份列(Jan-17,Feb-17,等等) 它会对第一个数据行执行此操作(即,brand1),但在第一个外部循环完成后,它会以

我正在尝试重新格式化CSV,将每个月的列转换为每个记录的单独行(基本上是旋转),即:

进入:

为此,我认为最好的方法是:

  • 循环浏览每一行,循环浏览每个月列(
    Jan-17
    Feb-17
    ,等等),然后复制该行
  • 然后将月份和总计插入
    日期
    总计
  • 然后删除重复的记录并从索引停止的位置开始(即,在每个日期的5个记录循环之后,开始的索引将是5)
  • 然后,当所有行都被复制时,删除月份列(
    Jan-17
    Feb-17
    ,等等)
它会对第一个数据行执行此操作(即,
brand1
),但在第一个外部循环完成后,它会以以下方式中断:

标签[5]不在[索引]中

终端输出:

-------------- INITIAL DATA FRAME:
    brand  Jan-17  Feb-17  Mar-17  Apr-17  May-17 date  totals
0  brand1     222     333     444     555     666            0
1  brand2    7777    8888    9999    1010    1111            0
2  brand3   12121   13131   14141   15151   16161            0
-------------- DATA FRAME AFTER FIRST OUTER LOOP (ROW) ITERATION:
    brand  Jan-17  Feb-17  Mar-17  Apr-17  May-17    date  totals
0  brand1     222     333     444     555     666  May-17     666
1  brand1     222     333     444     555     666  Apr-17     555
2  brand1     222     333     444     555     666  Mar-17     444
3  brand1     222     333     444     555     666  Feb-17     333
4  brand1     222     333     444     555     666  Jan-17     222
6  brand2    7777    8888    9999    1010    1111               0
7  brand3   12121   13131   14141   15151   16161               0
Traceback (most recent call last):
  File "/Users/danielturcotte/Sites/project/env/lib/python3.6/site-packages/pandas/core/indexing.py", line 1506, in _has_valid_type
    error()
  File "/Users/danielturcotte/Sites/project/env/lib/python3.6/site-packages/pandas/core/indexing.py", line 1501, in error
    axis=self.obj._get_axis_name(axis)))
KeyError: 'the label [5] is not in the [index]'
错误

KeyError:'标签[5]不在[索引]中'


我的一个想法是因为我使用的是
.loc[index]
,其中index是一个整数,可能是
.loc
,但
.iloc[]
是。如果我这样做

df.iloc[nextDuplicateRowStartIndex-1] = df.iloc[nextDuplicateRowStartIndex].values
我得到一个错误:

ValueError:轴中不包含标签[10]

终端输出产生
NaN
s:

    brand  Jan-17  Feb-17  Mar-17  Apr-17  May-17    date  totals
0     NaN     NaN     NaN     NaN     NaN     NaN  May-17     NaN
1     NaN     NaN     NaN     NaN     NaN     NaN  Apr-17     NaN
2     NaN     NaN     NaN     NaN     NaN     NaN  Mar-17     NaN
3     NaN     NaN     NaN     NaN     NaN     NaN  Feb-17     NaN
4     NaN     NaN     NaN     NaN     NaN     NaN  Jan-17     NaN
6  brand2  7777.0  8888.0  9999.0  1010.0  1111.0             0.0
7     NaN     NaN     NaN     NaN     NaN     NaN  Apr-17     NaN
虽然我不相信这是问题所在,因为
print(df.iloc[0])
print(df.loc[0])
都会产生相同的结果(即使我使用整数访问
loc[0]


进行熔化操作:

您可以使用它。它允许您选择多个ID列和值列。在您的例子中,值列是除“brand”之外的所有内容,因此我们可以忽略该参数。因此,您可以在一行中完成所有操作:

import pandas as pd

df = pd.DataFrame({
    'brand': ['brand1', 'brand2', 'brand3'],
    'Jan-17': [22, 232, 324],
    'Feb-17': [333, 424, 999]
    # ...
})

rearranged = pd.melt(df, id_vars=['brand'], var_name='Date',
                     value_name='Total')

print(rearranged)
这张照片是:

    brand    Date  Total
0  brand1  Feb-17    333
1  brand2  Feb-17    424
2  brand3  Feb-17    999
3  brand1  Jan-17     22
4  brand2  Jan-17    232
5  brand3  Jan-17    324

通过使用asongtoruin的数据和
堆栈

df.set_index('brand').stack().reset_index(name='Total').rename(columns={'level_1':'Date'})
Out[1043]: 
    brand    Date  Total
0  brand1  Feb-17    333
1  brand1  Jan-17     22
2  brand2  Feb-17    424
3  brand2  Jan-17    232
4  brand3  Feb-17    999
5  brand3  Jan-17    324

别担心,朋友!它非常强大,所以你应该经常检查是否有一个自动的方法来做某事。是的,我想要一个更实用的方法来做它,但找不到。感谢分享请参见上面的终端输出(底部的最新编辑):它重复
日期
总计
列的
brand1、brand2、brand3
。这是为什么?大概是因为您仍然在问题的开头添加了
date
totals
列-
df['date']='
df['totals']=0
行。你不再需要他们了。是的,我也不知道为什么这被否决了。似乎
stack
是一个不错的选择。Wen,你知道我为什么要用
stack
而不是
melt
?@Growler如果你注意到了品牌,stack不会改变你原来的第1行、第2行、第3行的顺序,有时候,很难回到原来的顺序one@Growler比如说,你最初的订单是brand2 brand1 brand3,当你融化时,它将很难转换回来,除非你通过
sort
+
key
多做一步,我也不知道为什么这会被否决,这是一个很好的答案。我发现
melt
更具可读性,但在这种情况下,这完全是个人偏好。@asongtoruin没关系,谢谢:-),顺便说一句
melt
对于这些情况更为通用。
df.set_index('brand').stack().reset_index(name='Total').rename(columns={'level_1':'Date'})
Out[1043]: 
    brand    Date  Total
0  brand1  Feb-17    333
1  brand1  Jan-17     22
2  brand2  Feb-17    424
3  brand2  Jan-17    232
4  brand3  Feb-17    999
5  brand3  Jan-17    324