Исправить повторяющиеся имена индексов в фрейме данных

Я ищу простейшее решение для создания фрейма данных Python из файла CSV с повторяющимися именами индексов (s1 и s2 в приведенном ниже примере).

Вот как выглядит файл CSV:

       var1   var2    var3
unit x    8      4      12
temp y   -1     -4      -3
time     
s1        9     12      11
s2       12     15       7
month    
s1        1      3      12 
s2        2      4       6

Фрейм данных Python должен быть следующим:

        var1   var2    var3
unit x     8      4      12
temp y    -1     -4      -3
time s1    9     12      11
time s2   12     15       7
month s1   1      3      12
month s2   2      4       6

Как лучше всего выполнить эту операцию?

2
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Использовать:

#convert index to Series
s = df.index.to_series()
#identify duplicated values
m = s.duplicated(keep=False)
#replace dupes by NaNs and then by forward filling
df.index = np.where(m, s.mask(m).ffill() + ' ' + s.index, s)
#remove only NaNs rows
df = df.dropna(how='all')
print (df)
          var1  var2  var3
unit x     8.0   4.0  12.0
temp y    -1.0  -4.0  -3.0
time s1    9.0  12.0  11.0
time s2   12.0  15.0   7.0
month s1   1.0   3.0  12.0
month s2   2.0   4.0   6.0

Эта строка дает предупреждение ниже: df.index = np.where (m, s.mask (m) .ffill () + '' + s.index, s) FutureWarning: использование '+' для обеспечения объединения с индексами устарело, используйте '|' или .union () Есть ли способ переписать его с помощью union () или '|'?

arqchicago 10.09.2018 19:39

@arqchicago как работает df.index = np.where(m, s.mask(m).ffill() + ' ' + s, s)?

jezrael 10.09.2018 21:09

считается фреймворком

        C   D   E
A   B           
a   4   7.0 1.0 5.0
5   3.0 4.0 5.5
b   5   8.0 3.0 3.0
c   4   9.0 5.0 6.0
f   4   3.0 0.0 4.0

вы можете использовать df.reset_index drop is False, который может сделать количество столбцов на основе уровней индекса, затем вы можете назначить его основному индексу после его преобразования

#converting index to columns
df = df1.reset_index()
# Assigning multilevel index columns to main index
df.index = df[df.columns[0]].astype(str)+' '+df[df.columns[1]].astype(str)
# dropping the indexed columns
df = df.drop(df.columns[[0,1]],axis=1)

Из:

    C   D   E
a 4 7.0 1.0 5.0
a 5 3.0 4.0 5.5
b 5 8.0 3.0 3.0
c 4 9.0 5.0 6.0
f 4 3.0 0.0 4.0

Другие вопросы по теме