Python 干净的切片方式+;堆叠数据帧
我有一个熊猫数据帧,比如df,是1099行乘33行。我需要原始文件由另一个软件处理,但它的格式不正确。这就是为什么我要用熊猫制作好的格式 问题很简单:df由标识符列组成(在实际情况中为7列,在下面的示例中仅为3列),然后按月份由相应的结果组成。说清楚,这就像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
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