重塑pandas DataFrame

时间:2015-09-03 09:27:30

标签: python-2.7 pandas dataframe

我有两个DataFrame,每个DataFrame都使用相同的列名称和一些相同的行名称;例如,一个包含此内容的csv文件:

Location    method  reading  date
1             M      2.8    12-Jun
1             A       3     12-Jun
2             M      2.5    12-Jun
2             A      3.1    12-Jun
3             M      4      12-Jun
3             A      2.2    12-Jun

以及另一个有此内容的人:

Location    method  reading  date
   1         M       2.9    13-Jun
   1         A        3     13-Jun
   2         M       2.6    13-Jun
   2         A       3.1    13-Jun
   3         M       3.9    13-Jun
   3         A       2.2    13-Jun

我想将它们组织成一个如下所示的DataFrame:

         1/M    1/A  2/M    2/A  3/M    3/A
12-Jun   2.8     3   2.5    3.1   4     2.2
13-Jun   2.9     3   2.6    3.1  3.9    2.2

其中我的数据帧列名称是每个位置+每个方法(例如:1 / M用于位置1和方法M)。如何以有效的方式完成这项工作。我写了这样的话:

data1=pd.read_csv("csv1.csv")
data2=pd.read_csv("csv2.csv")
list1={}
list2={}


for index, row in  data1.iterrows():
  list=[]
  list.append(row["date"])
  list.append(row["reading"])
  list1[row["location"]+row["method"]]=list

但我被困在那里。

2 个答案:

答案 0 :(得分:1)

df成为第一个数据帧。我将使用pivot方法:

d = pd.pivot_table(df,index='date',columns=['Location','method'], values='reading')

返回:

Location  1         2         3   
method    A    M    A    M    A  M
date                              
12-Jun    3  2.8  3.1  2.5  2.2  4

然后我将列级别名称组合起来以获得新的列列表:

L = []

for index,row in d.columns:
    c = str(index) + '/' + str(row)
    L.append(c)

然后将新的L列表指定为数据框的列:

d.columns = L

结果是:

        1/A  1/M  2/A  2/M  3/A  3/M
date                                
12-Jun    3  2.8  3.1  2.5  2.2    4

希望有所帮助。同样的工作结合了两个数据帧。

编辑:

如果df1是第一个数据框,df2是第二个,您可以将它们合并为一个df,其中包含:{/ p>

df = df1.append(df2)

然后将方法应用于它。

答案 1 :(得分:1)

您正在寻找的功能是pivot。请务必阅读本教程:

http://pandas.pydata.org/pandas-docs/stable/reshaping.html

数据来自两个数据帧的事实是无关紧要的,所以我将它们连接起来开始:

df = pd.concat([data1, data2], ignore_index=True)
df['loc_method'] = df['Location'].astype('str') + '/' + df['method']
df.pivot(index='date', columns='loc_method', values='reading')

结果:

loc_method  1/A  1/M  2/A  2/M  3/A  3/M
date                                    
12-Jun        3  2.8  3.1  2.5  2.2  4.0
13-Jun        3  2.9  3.1  2.6  2.2  3.9