按列对数据分组

2024-09-30 01:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,看起来像:

[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


Tags: 文件csv数据importpandasdatetimedateas
2条回答

如果第一行和第二行是列,则可以使用^{}^{}

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

您不需要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)

我们可以使用相同的技术来提取城市、最小值和最大值。^{}用于整数位置选择。它使用(行、列)选择索引。我们忽略了第一个值(零索引值),所以我们使用[1:]来选择除第一个之外的所有行。你知道吗

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

我们可以用cities索引min_max_vals

min_max_vals.index = cities

我们现在需要创建一个带有日期和Min/Max的MultiIndex,并将其分配给dataframe。你知道吗

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()

相关问题 更多 >

    热门问题