Есть ли способ заменить каждое значение ячейки в кадре данных именем столбца, значением строки в первом столбце и самим значением?

У меня есть матрица в Excel, которую я читаю как pandas dataframe в python

 col1   col2   col3    
 C_0    a      f 
 C_1    b      g
 C_2    c      h
 C_3    d      i
 C_4    e      j

Я хочу иметь возможность объединить имя столбца, значения ячеек из первого столбца и текущее значение ячейки для всех ячеек в столбцах больше, чем col1.

Я по существу хочу следующий вывод:

 col1   col2            col3    
 C_0    col2_C_0_a      col3_C_0_f 
 C_1    col2_C_1_b      col3_C_1_g
 C_2    col2_C_2_c      col3_C_2_h
 C_3    col2_C_3_d      col3_C_3_i
 C_4    col2_C_4_e      col3_C_4_j

Я не мог найти способ сделать это в Python.

Всего 4 ответа


Как насчет:

for c in df.columns[1:]:
    df[c] = c + '_' + df['col1'] + '_' + df[c].astype(str)

Выход:

  col1          col2          col3
1  C_0  col2_C_0_0.0  col3_C_0_0.1
2  C_1  col2_C_1_0.5  col3_C_1_0.2
3  C_2  col2_C_2_1.0  col3_C_2_0.3
4  C_3  col2_C_3_0.0  col3_C_3_0.3
5  C_4  col2_C_4_0.5  col3_C_4_0.4
6  C_5  col2_C_5_1.0  col3_C_5_0.5

Используя radd :

m = df.astype(str).set_index('col1')
m.radd(m.index+'_',axis=0).radd(m.columns + '_').reset_index()

  col1        col2        col3
0  C_0  col2_C_0_a  col3_C_0_f
1  C_1  col2_C_1_b  col3_C_1_g
2  C_2  col2_C_2_c  col3_C_2_h
3  C_3  col2_C_3_d  col3_C_3_i
4  C_4  col2_C_4_e  col3_C_4_j

numpy.core.defchararray.add

from numpy.core.defchararray import add

dat = df.to_numpy().astype(str)
a = dat[:, 0]
b = df.columns.to_numpy().astype(str)[1:]
c = dat[:, 1:]

d = add(add(add(add(b, '_'), a[:, None]), '_'), c)

pd.DataFrame(np.column_stack([a, d]), df.index, df.columns)

  col1        col2        col3
0  C_0  col2_C_0_a  col3_C_0_f
1  C_1  col2_C_1_b  col3_C_1_g
2  C_2  col2_C_2_c  col3_C_2_h
3  C_3  col2_C_3_d  col3_C_3_i
4  C_4  col2_C_4_e  col3_C_4_j

_______________________________________________________

Эксперименты пиР

понимание

dat = [
    (a, *(f'{c}_{a}_{x}' for c, x in zip([*df][1:], X)))
                         for a, *X in zip(*map(df.get, df))
]

pd.DataFrame(dat, df.index, df.columns)

  col1        col2        col3
0  C_0  col2_C_0_a  col3_C_0_f
1  C_1  col2_C_1_b  col3_C_1_g
2  C_2  col2_C_2_c  col3_C_2_h
3  C_3  col2_C_3_d  col3_C_3_i
4  C_4  col2_C_4_e  col3_C_4_j

Ты нуждаешься в этом:

for col in [col for col df.columns if col!="col1"]:
    df[col]=df.apply(lambda x:col+"_"+x.col1+"_"+x[col],axis=1)

Есть идеи?

10000