2017-09-09 86 views
0

我有一个数据框架结构从多年来的人口统计数据的CSV文件中派生而来。即,文件中的列是每月的时间间隔(1999-01,1999-02 ... 2016-12),并且行是世界上不同的人口中心(例如伦敦,多伦多,波士顿等):提取和分组熊猫数据框中的列集合

df = pd.DataFrame({'1999-01' : [100, 5000, 8000], '1999-02' : [200, 6000, 9000], '1999-03' : [300, 7000, 10000], ..., cities : ['CityA', 'CityB', 'CityC' ...]}) 

我想按季度分隔这些列。因此,我想借此平均人口从1999年至1901年,1999年至1902年,为1999-9每一行,并为此项创建新列“1999Q1”,以每3个月做这个:

df_quarter = pd.DataFrame({'1999Q1' : [200, 6000, 9000], '1999Q2' : ..., cities = ['CityA', 'CityB', 'CityC' ...]}) 

#Q1 corresponds to months 01-03, Q2 to months 04-06, Q3 to months 07-09, Q4 months 10-12, all inclusive 

然而,我很难概念化查询来完成此操作。我有一半的想法使用.groupby()然后.agg(),但我不知道如何有效地指定一个3列分组并遍历列。有人能指点我正确的方向吗?

编辑:假设列不是日期,而是更抽象的东西,并且不能使用时间段的简单重新采样。例如:

#Prices of different foods from different vendors 
df = pd.DataFrame({'oranges' : [2, 3, 7], 'apples' : [6, 3, 9], 'cheese' : [13, 9, 11], 'milk' : [6, 5, 12], 'vendors' : ['VendorA', 'VendorB', 'VendorC']}) 

现在,如果我想创造两列,结合水果和牛奶制品,是有一些方法我可以指定索引聚集呢?

+2

请仔细阅读[这](HTTP://计算器.com/questions/20109391/how-to-make-good-reproducible-pandas-examples),并学习如何问一个好的熊猫问题。没有人会凭空为您制作实例和解决方案。 –

+0

将进行适当的编辑。 –

回答

0

可以to_datetime然后转换列month periodto_period第一,然后按列resampleaxis=1)和quarterq)与骨料mean

df = pd.DataFrame({'1999-01':[4,5,4,5,5,4], 
        '1999-02':[7,8,9,4,2,3], 
        '1999-03':[1,3,5,7,1,0], 
        '1999-04':[1,3,5,7,1,0], 
        '1999-05':[5,3,6,9,2,4]}, index=list('abcdef')) 

print (df) 
    1999-01 1999-02 1999-03 1999-04 1999-05 
a  4  7  1  1  5 
b  5  8  3  3  3 
c  4  9  5  5  6 
d  5  4  7  7  9 
e  5  2  1  1  2 
f  4  3  0  0  4 

df.columns = pd.to_datetime(df.columns).to_period('m') 
df = df.resample('q', axis=1).mean() 

print (df) 
    1999Q1 1999Q2 
a 4.000000  3.0 
b 5.333333  3.0 
c 6.000000  5.5 
d 5.333333  8.0 
e 2.666667  1.5 
f 2.333333  2.0 
+1

请停止鼓励低质量问题。如果有人回答我会立即下降。通过回答这些问题,您会鼓励更多这样的问题,除OP之外,您知道这将会帮助任何人。 –

+2

@cᴏʟᴅsᴘᴇᴇᴅ - 谢谢。嗯,我同意更好地回答,如果不错的输入数据,所需的输出,代码。这是理想的。但有时可能从文本中理解OP需要什么。所以看起来我明白了,所以我创造了答案。 – jezrael

+0

我同意@cᴏʟᴅsᴘᴇᴇᴅ在这里。如果我们仍然想继续并回答,我认为,OP或回答者应该重新格式化问题/添加详细信息以获得更好的未来使用。 – Zero