(Python2)结合mulilayer列的pandas数据帧

时间:2017-08-17 17:34:19

标签: python-2.7 pandas dataframe

我想添加格式相同的数据帧的值。 为了例如

>>> my_dataframe1

         class1 score
subject  1    2    3
student
0        1    2    5
1        2    3    9
2        8    7    2
3        3    4    7
4        6    7    7

>>> my_dataframe2

         class2 score
subject  1    2    3
student
0        4    2    2
1        4    4    14
2        8    7    7
3        1    2    NaN
4        NaN  2    3

如您所见,这两个数据框具有多层列,主列为“类得分”,子列为“主题”。 我想要做的是获得可以像这样显示的总和数据框

            score
subject  1    2    3
student
0        5    4    7
1        2    1    5
2        16   14   9
3        4    6    7
4        6    9    10

实际上,我可以通过

获取此数据帧
for i in my_dataframe1['class1 score'].index:
    my_dataframe1['class1 score'].loc[i,:] = my_dataframe1['class1 score'].loc[i,:].add(my_dataframe2['class2 score'].loc[i,:], fill_value = 0)

但是,当维度增加时,获取结果数据帧需要花费大量时间,而且我认为这不是解决问题的好方法。

3 个答案:

答案 0 :(得分:0)

IIUC:

df_out = df['class1 score'].add(df2['class2 score'],fill_value=0).add_prefix('scores_')

df_out.columns = df_out.columns.str.split('_',expand=True)

df_out

输出:

        scores          
             1   2     3
student                 
0          5.0   4   7.0
1          6.0   7  23.0
2         16.0  14   9.0
3          4.0   6   7.0
4          6.0   9  10.0

答案 1 :(得分:0)

如果您从第二个数据框添加values,它将忽略索引

# you don't need `astype(int)`.
my_dataframe1.add(my_dataframe2.values, fill_value=0).astype(int)

        class1 score        
subject            1   2   3
student                     
0                  5   4   7
1                  6   7  23
2                 16  14   9
3                  4   6   7
4                  6   9  10

设置

my_dataframe1 = pd.DataFrame([
    [1, 2, 5],
    [2, 3, 9],
    [8, 7, 2],
    [3, 4, 7],
    [6, 7, 7]
], pd.RangeIndex(5, name='student'), pd.MultiIndex.from_product([['class1 score'], [1, 2, 3]], names=[None, 'subject']))

my_dataframe2 = pd.DataFrame([
    [4, 2, 2],
    [4, 4, 14],
    [8, 7, 7],
    [1, 2, np.nan],
    [np.nan, 2, 3]
], pd.RangeIndex(5, name='student'), pd.MultiIndex.from_product([['class2 score'], [1, 2, 3]], names=[None, 'subject']))

答案 2 :(得分:0)

我接近这个的方法是将数据保存在同一个数据帧中。你可以连接已经存在的两个:

In [289]: pd.concat(dfs).groupby(level=0).mean()
Out[289]:
   Time   25   50   75  100
0   1.0  6.5  2.0  5.5  7.0
1   2.0  3.0  1.0  6.0  8.0
2   3.0  3.0  2.5  7.0  8.0
3   4.0  4.0  4.5  6.0  8.0
4   5.0  3.0  4.5  6.0  8.0

然后对较大的数据帧求和,指定In [276]: dfs Out[276]: [ Time 25 50 75 100 0 1 6 2 6 7 1 2 3 2 6 8 2 3 3 2 8 8 3 4 5 2 6 8 4 5 3 9 6 8, Time 25 50 75 100 0 1 7 2 5 7 1 2 3 0 6 8 2 3 3 3 6 8 3 4 3 7 6 8 4 5 3 0 6 8] In [277]: pd.concat([d.set_index('Time') for d in dfs]) Out[277]: 25 50 75 100 Time 1 6 2 6 7 2 3 2 6 8 3 3 2 8 8 4 5 2 6 8 5 3 9 6 8 1 7 2 5 7 2 3 0 6 8 3 3 3 6 8 4 3 7 6 8 5 3 0 6 8

big_df = pd.concat([my_dataframe1, my_dataframe2], axis=1)