Транспонирование текстовых файлов и добавление столбцов - PullRequest
0 голосов
/ 28 апреля 2020

У меня большой текстовый файл с 100000 строками и столбцами, как здесь

     Item   WS2.E  KE2.E  TT2.E 
     Sro01  0.2    0.5    0.55    
     Rro02  0.33   0.44   0.77
     Qro03  0.77   0.88   0.45
     Sro01  0.44   2.55   0.99

Я просто хочу транспонировать файл, как показано ниже, и мне нужно добавить один столбец с именем sample.

     Item   sample  value   
     Sro01  sample1  0.2                 
     Sro01  sample1  0.5
     Sro01  sample1  0.55
     Rro02  sample1  0.33  
     Rro02  sample1  0.44  
     Rro02  sample1  0.77
     Qro03  sample1  0.77   
     Qro03  sample1  0.88   
     Qro03  sample1  0.45
     Sro01  sample1  0.44  
     Sro01  sample1  2.55   
     Sro01  sample1  0.99

Я пытался использовать функцию транспонирования (datama sh transpose), но она не служит цели. Спасибо

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Взял ваш фрагмент и сохранил его как mash.

awk 'NR==1{printf "Item\tSample\tvalue\n"}NR>1{for(i=2;i<=NF;i++){printf "%s\tSample1\t%s\n",$1,$i}}' mash
Item    Sample  value
Sro01   Sample1 0.2
Sro01   Sample1 0.5
Sro01   Sample1 0.55
Rro02   Sample1 0.33
Rro02   Sample1 0.44
Rro02   Sample1 0.77
Qro03   Sample1 0.77
Qro03   Sample1 0.88
Qro03   Sample1 0.45
Sro01   Sample1 0.44
Sro01   Sample1 2.55
Sro01   Sample1 0.99

Как это работает?

NR == 1 {                                   # for the 1st line create the new header
        printf "Item\tSample\tvalue\n"
}
NR > 1 {   # for all data values 
    for (i = 2; i <= NF; i++) {             # iterate over fields greater or equal 2
        printf "%s\tSample1\t%s\n", $1, $i  # print the respective value
    }
}
0 голосов
/ 28 апреля 2020

Этот короткий код awk должен помочь вам:

awk 'BEGIN{print "Item Sample value"}  
     NR>1{for(i=2;i<=NF;i++)print $1,"sample1",$i}' file
0 голосов
/ 28 апреля 2020

Пожалуйста, используйте df.melt и отбросьте переменную колонку

df2=pd.melt(df, id_vars=['Item'], value_vars=['WS2.E', 'KE2.E','TT2.E'])
df2['sample']='sample1'
df2.drop(columns=['variable'], inplace=True)
df2

Если цепочка;

pd.melt(df.assign(sample='sample1'),id_vars=['Item','sample'], value_vars=['KE2.E','TT2.E','WS2.E',]).drop(columns=['variable'])

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...