按列名分组数据

时间:2016-03-05 15:06:17

标签: python python-2.7 pandas

我的数据框如下:

[date1] [date1] [date2] [date2]

[Min:]  [Max:]  [Min:]  [Max:]

A         B       C       D

我想要的输出如下:

['Date'] ['Min'] ['Max']

[date 1]   A        B

[date 2]   C        D

我将如何在熊猫中做到这一点?

我只是导入一个本地保存的csv。

import pandas as pd

import csv

import datetime

SampleWeatherDate = pd.read_csv(weatherdata.csv)

This is what my data looks like in excel

2 个答案:

答案 0 :(得分:1)

如果第一行和第二行是列,则可以使用Tpivot

print df
  date1     date2    
    Min Max   Min Max
0     A   B     C   D

print df.columns
MultiIndex(levels=[[u'date1', u'date2'], [u'Max', u'Min']],
           labels=[[0, 0, 1, 1], [1, 0, 1, 0]])

#transpose and reset_index
df = df.T.reset_index()
#set columns names
df.columns =['a','b','c']
print df
       a    b  c
0  date1  Min  A
1  date1  Max  B
2  date2  Min  C
3  date2  Max  D

#pivot
print df.pivot(index='a', columns='b', values='c')
b     Max Min
a            
date1   B   A
date2   D   C

数据解决方案:

import pandas as pd
import io

temp=u"""Date;2/4/17;2/4/17;2/5/17;2/5/17;2/6/17;2/6/17
City:;Min:;Max:;Min:;Max:;Min:;Max:
New York;28;34;29;35;30;36
Los Angeles;80;86;81;87;82;88"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), sep=";", index_col=0, header=[0,1])
print df
Date        2/4/17      2/5/17      2/6/17     
City:         Min: Max:   Min: Max:   Min: Max:
New York        28   34     29   35     30   36
Los Angeles     80   86     81   87     82   88

#transpose and reset_index
df = df.T.reset_index()
#convert column Date to datetime
df['Date'] = pd.to_datetime(df['Date'])
#strip : from column City:
df['City:'] = df['City:'].str.strip(':')
#remove : from column name City:
df.rename(columns={'City:':'City'}, inplace=True)
print df
        Date City  New York  Los Angeles
0 2017-02-04  Min        28           80
1 2017-02-04  Max        34           86
2 2017-02-05  Min        29           81
3 2017-02-05  Max        35           87
4 2017-02-06  Min        30           82
5 2017-02-06  Max        36           88
print df.pivot(index='Date', columns='City')
           New York     Los Angeles    
City            Max Min         Max Min
Date                                   
2017-02-04       34  28          86  80
2017-02-05       35  29          87  81
2017-02-06       36  30          88  82

答案 1 :(得分:0)

您不需要csv模块,因为您可以直接使用Pandas阅读它。

df = sample_weather_data = pd.read_csv(weatherdata.csv)

你的源数据格式很差,所以有很多事要做。

>>> df
          Date 2/4/17 2/4/17.1 2/5/17 2/5/17.1 2/6/17 2/6/17.1
0        City:   Min:     Max:   Min:     Max:   Min:     Max:
1     New York     28       34     29       35     30       36
2  Los Angeles     80       86     81       87     82       88

首先,请注意第二个日期附加的.1日期是如何重复的。另请注意,第一列是Date

>>> df.columns
Index([u'Date', u'2/4/17', u'2/4/17.1', u'2/5/17', u'2/5/17.1', u'2/6/17', u'2/6/17.1'], dtype='object')

让我们从第一个开始提取每个其他日期(请注意,Python使用基于零的索引)。

dates = df.columns[1::2]
>>> dates
Index([u'2/4/17', u'2/5/17', u'2/6/17'], dtype='object')

在我们处理它的同时,我们可以将它们转换为时间戳。

dates = pd.to_datetime(dates)

>>> dates
DatetimeIndex(['2017-02-04', '2017-02-05', '2017-02-06'], dtype='datetime64[ns]', freq=None)

我们可以使用相同的技术来提取City,Min和Max值。 iloc用于整数位置选择。它使用(行,列)选择索引。我们忽略了第一个值(零索引值),因此我们使用[1:]来选择除第一个之外的所有行。

cities = df.iloc[1:, 0]  # Column 0
min_max_vals = df.iloc[1:, 1:]  # Every column starting at 1, ignoring first row.

我们可以使用min_max_vals索引cities

min_max_vals.index = cities

我们现在需要创建一个带有日期和最小/最大值的MultiIndex并将其分配给数据框。

min_max_vals.columns = pd.MultiIndex.from_product([dates, ['Min', 'Max']])

你想要的输出是错过城市的,所以我假设你真的想要这样的东西:

         ['City 1']        ['City 2]
['Date'] ['Min'] ['Max']   ['Min'] ['Max']

[date 1]   A        B       E       F

[date 2]   C        D       G       H

转置结果并取消堆叠:

>>> min_max_vals.T.unstack()
Date       New York     Los Angeles    
                Max Min         Max Min
2017-02-04       34  28          86  80
2017-02-05       35  29          87  81
2017-02-06       36  30          88  82

<强>摘要

df = sample_weather_data = pd.read_csv('weatherdata.csv')
dates = pd.to_datetime(df.columns[1::2])
min_max_vals = df.iloc[1:, 1:]  
min_max_vals.index = df.iloc[1:, 0] 
min_max_vals.columns = pd.MultiIndex.from_product([dates, ['Min', 'Max']])
df = min_max_vals.T.unstack()