У меня есть мультииндексированный фрейм данных, и я хочу добавить к каждому из наиболее внешних индексов еще одну строку, где два других индекса помечены определенной строкой (та же строка для всех индексов во всех значениях). Другие значения этой строки могут быть пустыми или что-то еще.

Я пытался создать другой фрейм данных, используя групповую обработку и добавляя их, но я не могу заставить индексы работать.

Например, для фрейма данных:

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>
1
Yotam Hacohen 30 Окт 2019 в 05:23

3 ответа

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
0
BENY 30 Окт 2019 в 05:38

Вы можете распаковать, назначить, сложить:

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
0
Quang Hoang 30 Окт 2019 в 05:40

Или попробуйте использовать:

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
0
U12-F̉͋̅̾̇orward 30 Окт 2019 в 05:54