在多索引数据框的每个索引上添加一行

时间:2019-10-30 02:23:29

标签: python pandas dataframe

我有一个多索引的数据框,我想在最外部的索引的每一行中添加另一行,其中的另外两个索引用特定的字符串标记(所有值中所有索引的字符串均相同)。该行的其他值可以为空或其他任何值。

我尝试使用groupby创建另一个数据框并附加它们,但无法使索引正常工作。

例如,对于数据框:

Index1  Index2  Index3  val
A        d       1       a
A        d       2       b
A        e       3       c
A        e       4       d
B        f       5       e
B        f       6       f
B        g       7       g
C        h       8       h
C        h       9       i 
C        i       10      j

我想得到:

Index1  Index2  Index3  val
A        d       1       a
A        d       2       b
A        e       3       c
A        e       4       d
A        StringA StringA <any value>
B        f       5       e
B        f       6       f
B        g       7       g
B        StringA StringA <any value>
C        h       8       h
C        h       9       i 
C        i       10      j
C        StringA StringA <any value>

3 个答案:

答案 0 :(得分:0)

IIUC

s=pd.DataFrame({'Index1':df.Index1.unique(),
              'Index2':df.Index1.radd('String').unique(),
              'Index3': df.Index1.radd('String').unique(),
              'val':[1]*df.Index1.nunique()})
pd.concat([df.reset_index(),s]).sort_values('Index1').set_index(['Index1','Index2','Index3'])
Out[301]: 
  Index1   Index2   Index3 val
0      A        d        1   a
1      A        d        2   b
2      A        e        3   c
3      A        e        4   d
0      A  StringA  StringA   1
4      B        f        5   e
5      B        f        6   f
6      B        g        7   g
1      B  StringB  StringB   1
7      C        h        8   h
8      C        h        9   i
9      C        i       10   j
2      C  StringC  StringC   1

答案 1 :(得分:0)

您可以取消堆叠,分配,堆叠:

new_df = df.unstack(level=(-1,-2))

# you can pass a series here
new_df[('val','StringA','StringA')] = 'ABC'

new_df.stack(level=(-1,-2))

输出:

                        val
Index1 Index2  Index3      
A      d       1          a
               2          b
       e       3          c
               4          d
       StringA StringA  ABC
B      f       5          e
               6          f
       g       7          g
       StringA StringA  ABC
C      h       8          h
               9          i
       i       10         j
       StringA StringA  ABC

答案 2 :(得分:0)

或尝试使用:

groupby = df.groupby(df['Index1'], as_index=False).last()
groupby[['Index2', 'Index3', 'val']] = ['StringA', 'StringA', np.nan]
df = pd.concat([df, groupby]).sort_values(['Index1', 'Index3']).reset_index()
print(df)

输出:

    index Index1   Index2   Index3  val
0       0      A        d        1    a
1       1      A        d        2    b
2       2      A        e        3    c
3       3      A        e        4    d
4       0      A  StringA  StringA  NaN
5       4      B        f        5    e
6       5      B        f        6    f
7       6      B        g        7    g
8       1      B  StringA  StringA  NaN
9       7      C        h        8    h
10      8      C        h        9    i
11      9      C        i       10    j
12      2      C  StringA  StringA  NaN