如何转换数据帧新格式?

时间:2017-02-14 07:27:10

标签: python pandas 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

现在我想转换回这个结果,但我无法进行转换。

3 个答案:

答案 0 :(得分:1)

选项1
rubik的立方体

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

答案 1 :(得分:1)

您可以将concatdrop_duplicatessort_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.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的另一种解决方案 - 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

答案 2 :(得分:0)

0    1193
1     661
2     914
3    3408
4    2355
Name: id, dtype: object