Pandas разделяет DataFrame, когда имя столбца находится в значениях - PullRequest
0 голосов
/ 16 мая 2019

У меня есть один кадр данных, который плохо отформатирован, он выглядит как

0  1
col_name1     val1
col_name2     val2
col_name3     val3
col_name1     val4
col_name2     val5
col_name3     val6
.  .             .
.  .             .

и я хотел, чтобы это выглядело как

col_name1,col_name2,col_name3
val1,val2,val3
val4,val5,val6

Как я могу разделить это таким образом?

Я пытался транспонировать фрейм данных и не работал так же для некоторых групповых манипуляций.

Ответы [ 5 ]

1 голос
/ 16 мая 2019

Использование DataFrame.set_index с GroupBy.cumcount для MultiIndex и изменение формы на Series.unstack:

df = df.set_index([df.groupby(0).cumcount(), 0])[1].unstack().rename_axis(None, axis=1)
print (df)
  col_name1 col_name2 col_name3
0      val1      val2      val3
1      val4      val5      val6
1 голос
/ 16 мая 2019

Вот, пожалуйста,

Исходный фрейм данных

enter image description here

STEP1: Сгруппируйте данные по «1-му столбцу»

df_temp = df.groupby(0)[1].apply(list)

STEP2: Получить имена столбцов для нового фрейма данных:

col_names = df_temp.index

STEP3: Получить значения строк и сохранить их в виде списка:

row_values = df_temp.values.tolist()

STEP4: Создать новый фрейм данных inжелаемый формат:

new_df = pd.DataFrame(row_values, columns=  col_names)
new_df = new_df.T.rename_axis(None, axis=1)
new_df = new_df.reset_index(drop=True)

enter image description here

1 голос
/ 16 мая 2019
new_df = {i:[] for i in list(set(df["0"]))}
for i in range(len(df)):
    new_df[df["0"][i]].append(df["1"][i])

Result
col_name2 col_name3 col_name1
0      val2      val3      val1
1      val5      val6      val4
1 голос
/ 16 мая 2019

Если порядок строк согласован, вы можете просто повернуть свой фрейм данных после добавления нового псевдоиндекса с помощью int(index / 3):

df['ndx'] = (df.index / 3).astype(int)
df = df.pivot(index='ndx', columns='0', values='1')

Если вы не уверены, это будет более надежно при условии col_name1всегда на первом месте:

df['ndx'] = pd.Series(np.where(df['0'] == 'col_name1', df.index, np.nan),
                      index = df.index).fillna(method='ffill').astype(int)
df = df.pivot(index='ndx', columns='0', values='1')
1 голос
/ 16 мая 2019

Вы можете использовать:

m=df.groupby('0')['1'].apply(list)
df1=pd.DataFrame(m.values.tolist(),index=m.index).T.rename_axis(None,axis=1)
print(df1)

  col_name1 col_name2 col_name3
0      val1      val2      val3
1      val4      val5      val6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...