我有两个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
但我被困在那里。
答案 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