Python 干净的切片方式+;堆叠数据帧

Python 干净的切片方式+;堆叠数据帧,python,pandas,dataframe,slice,Python,Pandas,Dataframe,Slice,我有一个熊猫数据帧,比如df,是1099行乘33行。我需要原始文件由另一个软件处理,但它的格式不正确。这就是为什么我要用熊猫制作好的格式 问题很简单:df由标识符列组成(在实际情况中为7列,在下面的示例中仅为3列),然后按月份由相应的结果组成。说清楚,这就像 A B C date1result date2result date2result a1 b1 c1 12 15 17 a2 b2 c3

我有一个熊猫数据帧,比如df,是1099行乘33行。我需要原始文件由另一个软件处理,但它的格式不正确。这就是为什么我要用熊猫制作好的格式

问题很简单:df由标识符列组成(在实际情况中为7列,在下面的示例中仅为3列),然后按月份由相应的结果组成。说清楚,这就像

A    B    C    date1result  date2result  date2result
a1   b1   c1       12           15           17
a2   b2   c3        5            8            3
但要进行处理,我需要每个结果有一行,为日期添加一列。在给定的示例中,它将是

A    B    C      result       date  
a1   b1   c1       12         date1 
a1   b1   c1       15         date2
a1   b1   c1       17         date3
a2   b2   c3        5         date1
a2   b2   c3        8         date2
a2   b2   c3        3         date3
因此,更准确地说,我已经手动编辑了所有带有日期的列名(在read_excel之后,看起来像“01/01/2015 0:00:00”之类的,我无法访问它们……作为第二个问题,有人知道如何访问从.xlsx中的日期字段导入的列吗?),因此日期列名现在是2015_01, 2015_02... 2015年12月,2016年1月,…,2016年12月,前五名分别为“账户”、“客户名称”、“邮政编码”、“分部”和“代表”。因此,我尝试了以下代码:

core = df.loc[:,('Account','Customer Name','Postcode','segment','Rep')]

df_final=pd.Series([])
for year in [2015,2016]:
    for month in range(1, 13):
        label = "%i_%02i" % (year,month)
        date = []
        for i in range(core.shape[0]):
            date.append("01/%02i/%i"%(month,year))  
        df_date=pd.Series(date) #I don't know to create this 1xn df
        df_final = df_final.append(pd.concat([core, df[label], df_date], axis=1))
这大致可行,但非常不干净:我得到一个(26376,30)形状的df_最终结果,第一列是日期,然后是结果,但当然以“2015_01”作为列名,然后所有的“2015_02”到“2016_12”都由NaN填写,最后是我的帐户”、“客户名称”、“邮政编码”、“细分”和“代表”列。有人知道我怎么能以一种干净的方式做这样的“切片+堆叠”吗

多谢各位

编辑:与这个问题大致相反:

我想你需要:

然后转换:


这大致与这个问题相反:非常好的功能,谢谢!您知道我如何将“变量”列中的值从2015年1月1日、2016年12月1日更改为2015年1月1日。。。同时到2016年12月1日?当然,再见!我在看《熔化》博士,它非常强大只有一件事:melt在模拟示例中起作用,但当我在真实数据上执行它时,我得到的不是要转换的日期,而是“Customer Area”。你知道为什么吗?我想你需要将所有不包含日期的列添加到
id\u vars
。如果它不起作用,问题是-你的样本和真实数据之间有什么区别?我只是没有从原始df中获取所有列(其中超过7列),这就是为什么。现在一切都很好,非常感谢!!!:)
df = pd.melt(df, id_vars=['A','B','C'], value_name='result', var_name='date')
print (df)
    A   B   C         date  result
0  a1  b1  c1  date1result      12
1  a2  b2  c3  date1result       5
2  a1  b1  c1  date2result      15
3  a2  b2  c3  date2result       8
4  a1  b1  c1  date3result      17
5  a2  b2  c3  date3result       3
print (df)
    A   B   C  2015_01  2016_10  2016_12
0  a1  b1  c1       12       15       17
1  a2  b2  c3        5        8        3

df = pd.melt(df, id_vars=['A','B','C'], value_name='result', var_name='date')
df.date = pd.to_datetime(df.date, format='%Y_%m')
print (df)
    A   B   C       date  result
0  a1  b1  c1 2015-01-01      12
1  a2  b2  c3 2015-01-01       5
2  a1  b1  c1 2016-10-01      15
3  a2  b2  c3 2016-10-01       8
4  a1  b1  c1 2016-12-01      17
5  a2  b2  c3 2016-12-01       3