Разделить строки на несколько строк на основе значения столбца - PullRequest
1 голос
/ 13 октября 2019

Вход DF :

Index  Parameters   A      B       C   
1      Apple        1      2       3   
2      Banana       2      4       5   
3      Potato       3      5       2   
4      Tomato       1 x 4  1 x 6   2 x 12

Выход DF

Index  Parameters   A      B       C   
1      Apple        1      2       3   
2      Banana       2      4       5   
3      Potato       3      5       2   
4      Tomato_P     1      1       2
5      Tomato_Q     4      6      12

Постановка задачи :

Я хочу преобразовать строку данных в несколько строк на основе определенного значения столбца (Tomato) и с параметром разделения как x

Код / Выводы :

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

В поисках решения, которое может работать непосредственно с данным фреймом

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Решение, если всегда только одно x значение в данных - сначала Series.str.split по столбцам в списке, затем Series.explode, все остальные столбцы добавляются с помощью DataFrame.join и установите _P с _Q с Series.duplicated и numpy.select:

cols = ['A','B','C']
df[cols] = df[cols].apply(lambda x : x.str.split(' x '))

df1 = pd.concat([df[x].explode() for x in cols],axis=1)
#print (df1)

df = df[df.columns.difference(cols)].join(df1)
df['Parameters'] += np.select([df.index.duplicated(keep='last'), 
                               df.index.duplicated()], 
                               ['_P','_Q'], 
                               default='')

df = df.reset_index(drop=True)
print (df)
  Parameters  A  B   C
0      Apple  1  2   3
1     Banana  2  4   5
2     Potato  3  5   2
3   Tomato_P  1  1   2
4   Tomato_Q  4  6  12

РЕДАКТИРОВАТЬ:

Ответ без ответа explode:

cols = df.columns[1:]

df1 = (pd.concat([df[x].str.split(' x ', expand=True).stack() for x in cols],axis=1, keys=cols)
         .reset_index(level=1, drop=True))
print (df1)
       A  B   C
Index          
1      1  2   3
2      2  4   5
3      3  5   2
4      1  1   2
4      4  6  12

df = df.iloc[:, [0]].join(df1)
df['Parameters'] += np.select([df.index.duplicated(keep='last'), 
                               df.index.duplicated()], 
                               ['_P','_Q'], 
                               default='')

df = df.reset_index(drop=True)
print (df)

  Parameters  A  B   C
0      Apple  1  2   3
1     Banana  2  4   5
2     Potato  3  5   2
3   Tomato_P  1  1   2
4   Tomato_Q  4  6   1
0 голосов
/ 13 октября 2019

Это больше похоже на explode проблему, доступную после панд 0.25

df[['A','B','C']]=df[['A','B','C']].apply(lambda x : x.str.split(' x '))
df
   Index Parameters       A       B        C
0      1      Apple     [1]     [2]      [3]
1      2     Banana     [2]     [4]      [5]
2      3     Potato     [3]     [5]      [2]
3      4     Tomato  [1, 4]  [1, 6]  [2, 12]
df.set_index(['Index','Parameters'],inplace=True)
pd.concat([df[x].explode() for x in ['A','B','C']],axis=1)
                  A  B   C
Index Parameters          
1     Apple       1  2   3
2     Banana      2  4   5
3     Potato      3  5   2
4     Tomato      1  1   2
      Tomato      4  6  12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...