2017-02-14 4 views
2

У меня есть dataframe:Как преобразовать формат данных в новый формат?

import pandas as pd 

df = pd.DataFrame({'cell': ['A1', 'A2', 'B1', 'A3', 'B2', 'B3', 'A4', 'B4'], 
        'site': ['A', 'A', 'B', 'A', 'B', 'B', 'A', 'B']}) 

>>> df 

    cell site 
0 A1 A 
1 A2 A 
2 B1 B 
3 A3 A 
4 B2 B 
5 B3 B 
6 A4 A 
7 B4 B 

Я хочу, чтобы получить новый формат:

A 
A1 
A2 
A3 
A4 
B 
B1 
B2 
B3 
B4 

Теперь я хочу, чтобы преобразовать обратно этот результат, но я не в состоянии сделать преобразование.

+0

HI! Добро пожаловать в [so]. Пожалуйста, прочитайте [ask] и предоставьте [mcve]. – jkalden

+0

Ну, я учусь – JiangBin

ответ

1

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

df = pd.concat([df.cell, df.site.drop_duplicates()]).sort_values().reset_index(drop=True) 
print (df) 
0  A 
1 A1 
2 A2 
3 A3 
4 A4 
5  B 
6 B1 
7 B2 
8 B3 
9 B4 
dtype: object 

Или используйте numpy methods - numpy.sort и numpy.concatenate:

df = pd.Series(np.sort(np.concatenate([df.cell.values, df.site.unique()]))) 
print (df) 
0  A 
1 A1 
2 A2 
3 A3 
4 A4 
5  B 
6 B1 
7 B2 
8 B3 
9 B4 
dtype: object 

Другим решением, если sorting не может быть использована - groupby с пользовательской функции:

df = df.groupby('site').cell 
     .apply(lambda x: pd.Series([x.name] + x.values.tolist())) 
     .reset_index(drop=True) 
print (df) 
0  A 
1 A1 
2 A2 
3 A3 
4 A4 
5  B 
6 B1 
7 B2 
8 B3 
9 B4 
Name: cell, dtype: object 
+0

спасибо, это правильно. – JiangBin

+0

@piRSquared - спокойной ночи, хлопоты для меня тоже не подходят;) – jezrael

1

вариант 1
кубик Рубика

print(
    df.groupby('site') 
     .cell.apply(list) 
     .apply(pd.Series) 
     .reset_index() 
     .stack() 
     .reset_index(drop=True) 
) 

вариант 2
понимание

pd.Series(
    np.concatenate(
     [[name] + grp.tolist() for name, grp in df.groupby('site').cell])) 

Оба Выход

0  A 
1 A1 
2 A2 
3 A3 
4 A4 
5  B 
6 B1 
7 B2 
8 B3 
9 B4 
dtype: object 
+0

спасибо, это правильно. – JiangBin

0
print pd.melt(df).iloc[:, 1].drop_duplicates().sort_values().reset_index(drop=True) 

0  A 
1 A1 
2 A2 
3 A3 
4 A4 
5  B 
6 B1 
7 B2 
8 B3 
9 B4 
+0

спасибо, это правильно. – JiangBin

Смежные вопросы