按列的子字符串对Pandas Dataframe进行排序

时间:2018-04-09 07:45:28

标签: python pandas dataframe python-3.6

给定一个DataFrame:

    name             email
0   Carl    carl@yahoo.com
1    Bob     bob@gmail.com
2  Alice   alice@yahoo.com
3  David  dave@hotmail.com
4    Eve     eve@gmail.com

如何根据电子邮件的域名(按字母顺序,按升序排序)进行排序,然后在每个域组内根据" @"?

对上述内容进行排序的结果应为:

    name             email
0    Bob     bob@gmail.com
1    Eve     eve@gmail.com
2  David  dave@hotmail.com
3  Alice   alice@yahoo.com
4   Carl    carl@yahoo.com

2 个答案:

答案 0 :(得分:3)

使用:

df = df.reset_index(drop=True)
idx = df['email'].str.split('@', expand=True).sort_values([1,0]).index
df = df.reindex(idx).reset_index(drop=True)
print (df)
    name             email
0    Bob     bob@gmail.com
1    Eve     eve@gmail.com
2  David  dave@hotmail.com
3  Alice   alice@yahoo.com
4   Carl    carl@yahoo.com

<强>解释

  1. 第一个heredrop=True为唯一默认索引<​​/ li>
  2. 然后reset_index值为新DataFramesplit
  3. 上次sort_values新订单

答案 1 :(得分:3)

选项1
sorted + reindex

df = df.set_index('email')
df.reindex(sorted(df.index, key=lambda x: x.split('@')[::-1])).reset_index()

              email   name
0     bob@gmail.com    Bob
1     eve@gmail.com    Eve
2  dave@hotmail.com  David
3   alice@yahoo.com  Alice
4    carl@yahoo.com   Carl

选项2
sorted + pd.DataFrame
作为替代方案,您可以通过重新创建新的DataFrame来撤消选项1中的reindex调用。

pd.DataFrame(
    sorted(df.values, key=lambda x: x[1].split('@')[::-1]), 
    columns=df.columns
)

    name             email
0    Bob     bob@gmail.com
1    Eve     eve@gmail.com
2  David  dave@hotmail.com
3  Alice   alice@yahoo.com
4   Carl    carl@yahoo.com