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