我有一个数据框:
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 :(得分: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)
您可以将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
答案 2 :(得分:0)
0 1193
1 661
2 914
3 3408
4 2355
Name: id, dtype: object