Iam*_*rus 6 python dataframe pandas 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
Run Code Online (Sandbox Code Playgroud)
如何根据电子邮件的域名(按字母顺序,按升序排序)进行排序,然后在每个域组内根据"@"之前的字符串进行排序?
排序上面的结果应该是:
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
Run Code Online (Sandbox Code Playgroud)
用:
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
Run Code Online (Sandbox Code Playgroud)
说明:
reset_index用drop=True独特的默认指标split值到新的DataFrame和sort_valuesreindex到新订单选项 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
Run Code Online (Sandbox Code Playgroud)
选项 2
sorted +pd.DataFrame
作为替代方案,您可以reindex通过重新创建新的 DataFrame 来放弃选项 1 的调用。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |