Добавление нескольких строк в одну строку в pandas - PullRequest
0 голосов
/ 08 мая 2020

Это продолжение следующего вопроса .

Это мой фрейм данных:

nan = ""
d = {'NAME': ['a','a','b','b','c','c','c','c','c','d','d','d','d','d','d'],
 'col1': ['P100','P100','P100','P100','MS','MS','MS','MS','MS','MS','MS','MS','MS','MS','MS'],
 'col2': ['CNMZ',
  'CNMZ',
  'COMX',
  'COMX',
  '_NCTE',
  '_NCTE',
  '_NCTE',
  '_NCTE',
  '_NCTE',
  'T1MF',
  'T1MF',
  'T1MF',
  'T1MF',
  'T1MF',
  'T1MF'],
 'stepNo': [1, 2, 1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6],
 'col4': ['xyz',
  'abc',
  'pqr',
  'gvt',
  'mno',
  'tru',
  'ercm',
  'lotr',
  'ddlj',
  'refv',
  'ecv',
  'ecv',
  'ecv',
  'ecv',
  'ecv'],
 'col5': ['PHL',
  'PHL',
  'BHL',
  'ALT',
  'MRS',
  'MRS',
  'TUL',
  'MRS',
  'FAT',
  'PHL',
  'PHL',
  'JEN',
  'FTW',
  'AMB',
  'KGP'],
 'col6': ['CP',
  'CO',
  'CP',
  'CO',
  'CP',
  'CO',
  'CO',
  'CO',
  'RT',
  'CO',
  'CO',
  'CO',
  'CP',
  'CO',
  'CO'],
 'col7': ['PHL',
  'PHL',
  'ALT',
  'ALT',
  'MRS',
  'TUL',
  'MRS',
  'FAT',
  'FAH',
  'PHL',
  'JEN',
  'FTW',
  'AMB',
  'KGP',
  'KGP'],
 'col8': ['CO',
  'CO',
  'CO',
  'CO',
  'CO',
  'CO',
  'CO',
  'RT',
  'CP',
  'CO',
  'CO',
  'CP',
  'CO',
  'CO',
  'CO'],
 'col9': ['SID',
  'M/M',
  'SID',
  'U/D',
  'AL LO',
  'AL LO',
  'AL LO',
  'AL LO',
  'AL LO',
  'M/M',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'DCS'],
 'col10': ['SID',
  'M/M',
  'SID',
  'U/D',
  'AL LO',
  '3 M',
  '3 M',
  'M/M',
  'AL LO',
  'M/M',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'DCS'],
 'col11': [nan,
  'ATM',
  nan,
  'PACK',
  'AL LP',
  'DCS',
  'DCS',
  'DAM',
  'DAM',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'M/M'],
 'col12': [nan,
  'SID',
  nan,
  'PACK',
  'CAL LO',
  'DCS',
  'DCS',
  'M/M',
  'CAL LO',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'DCS',
  'AL LO'],
 'col13': ['abc',
  '-02-1_',
  '-1',
  '-13_',
  nan,
  nan,
  nan,
  'T1_VT1.',
  nan,
  '-06',
  nan,
  nan,
  nan,
  nan,
  '-03_02-03'],
 'col14': [nan,
  nan,
  nan,
  nan,
  '102/',
  '102/',
  '102/',
  nan,
  '101/',
  nan,
  '3405',
  '3102/',
  '3111/',
  '3102/',
  nan]}
df = pd.DataFrame(d)

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

Вывод:

NAME   col1    col2   stepNo  col4...........col14    NAME col1   col2   stepNo   col4...........col14   NAME   col1    col2   stepNo  col4...........col14    NAME col1   col2   stepNo   col4...........col14
 a     P100    CNMZ     1      xyz            nan       a  P100   CNMZ     2       abc            nan
 b     P100    COMX     1      pqr            nan       b  P100   COMX     2       gvt            nan
 c      MS    _NCTE     1      mno            102/      c   MS   _NCTE     2       tru            102/   c      MS    _NCTE     3      ercm           102/     c    MS   _NCTE     4       lotr           nan   

Так как NAME=3 имеет 5 строк, на выходе будет еще 1 набор столбцов.

Для NAME=4 будет 6 наборы столбцов в выводе.

Я надеюсь, что вывод примера достаточно информативен. Если нет, вы можете сослаться на связанный вопрос в начале для лучшего понимания.

Это было предложенное решение, но оно не работает для приведенного выше примера:

dfs = []
for i in range(min(df['stepNo']), max(df['stepNo'])+1):
    dfs.append(df[df['stepNo']==i].reset_index())
dfx = pd.concat(dfs, axis=1)
dfx.drop(inplace=True, columns=['index'])

Возможно ли получить ожидаемое вывод?

1 Ответ

1 голос
/ 08 мая 2020
map_name = dict( enumerate(df['NAME'].factorize()[1] ) )
map_name = dict(map(reversed, map_name.items()))
df2 = np.zeros((df.NAME.nunique(), df.stepNo.max() * len(df.columns))).astype(object)

for i,g in df.groupby(['NAME','stepNo']):

    df2[map_name[i[0]], (i[1]-1)*len(df.columns):(i[1])*len(df.columns)] = g.values

df2 = pd.DataFrame(df2)
df2.columns = np.tile(df.columns, df.stepNo.max())
df2['stepNo'] = df2['stepNo'].astype(int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...