В Pandas, как я могу разделить столбец на основе значения из другого столбца? - PullRequest
1 голос
/ 09 ноября 2019

Я бы хотел перейти от этой структуры данных:

df = pd.DataFrame({'col1':['a','a','b','b','c','c'],
               'col2':['str_a1','str_a2','str_b1','str_b2','str_c1','str_c2']})

df

к этой

df2 = pd.DataFrame({'col1_1':['a','b','c'],
                'col2_1':['str_a1','str_b1','str_c1'],
                'col2_2':['str_a2','str_b2','str_c2']})
df2

Есть ли способ сделать это в пандах?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

Использование, assign и pivot и add_prefix

s = df.groupby('col1').cumcount().add(1)
df_out =  (df.assign(n=s).pivot('col1', 'n', 'col2').add_prefix('col2_')
             .reset_index())

Out[32]:
n col1  col2_1  col2_2
0    a  str_a1  str_a2
1    b  str_b1  str_b2
2    c  str_c1  str_c2

Или set_index и pivot и T

s = df.groupby('col1').cumcount().add(1)
df_out = (df.set_index(s).pivot(columns='col1', values='col2')
            .rename(lambda x: f'col2_{x}').T.reset_index())

Out[75]:
  col1  col2_1  col2_2
0    a  str_a1  str_a2
1    b  str_b1  str_b2
2    c  str_c1  str_c2
2 голосов
/ 09 ноября 2019

Давайте попробуем, используя set_index с groupby и cumcount, затем изменим форму с unstack и сгладим заголовок многоиндексного столбца:

df_out = df.set_index(['col1', df.groupby('col1').cumcount() + 1]).unstack()
df_out.columns = [f'{i}_{j}' for i, j in df_out.columns]
print(df_out.reset_index())

Вывод:

  col1  col2_1  col2_2
0    a  str_a1  str_a2
1    b  str_b1  str_b2
2    c  str_c1  str_c2
0 голосов
/ 09 ноября 2019

Если ваш 'col1' повторяется столько же раз, то вы можете использовать numpy reshape, как показано ниже, чтобы получить результат

df = pd.DataFrame({'col1':['a','a','b','b','c','c'],
               'col2':['str_a1','str_a2','str_b1','str_b2','str_c1','str_c2']})

## 4 is square of number of repeates in this case 2*2
ar = df.values.reshape(-1, 4)
result = pd.DataFrame(np.c_[ar[:,0], ar[:,1::2]], columns=["col1_1", "col2_1", "col2_2"])
result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...