2017-02-14 3 views
2

私はデータフレームを持っている:データフレームの新しい形式を変換するには?

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

あなたはdrop_duplicatessort_valuesconcatを使用することができます。

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.sortnumpy.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が使用できない場合 -カスタム関数と3210:

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

関連する問題