pandas的dataframe如何按指定list排序:
import pandas as pd
import numpy as np
#Series数据
s = pd.Series({'a':1, 'b':2, 'c':3})
print(s)
#list数据
list_custom = ['b', 'a', 'c']
#将series转换成dataframe
df = pd.DataFrame(s)
#重置df的索引,原来的索引变为一列
df = df.reset_index()
#设置列名
df.columns = ['word', 'number']
print(df)
#设置成"category"数据类型
df['word'] = df['word'].astype('category')
#inplace=True,使recorder_categories生效
df['word'].cat.reorder_categories(list_custom, inplace = True)
#inplace=True,使df生效
df.sort_values('word', inplace=True)
print(df)
out:
a 1
b 2
c 3
dtype: int64
word number
0 a 1
1 b 2
2 c 3
word number
1 b 2
0 a 1
2 c 3
将含有多值的列进行拆分:
import pandas as pd
import numpy as np
data = {'Country':['China','US','Japan','EU','UK/Australia', 'UK/Netherland'],
'Number':[100, 150, 120, 90, 30, 2],
'Value': [1, 2, 3, 4, 5, 6],
'label': list('abcdef')}
df = pd.DataFrame(data)
print(df)
out:
Country Number Value label
0 China 100 1 a
1 US 150 2 b
2 Japan 120 3 c
3 EU 90 4 d
4 UK/Australia 30 5 e
5 UK/Netherland 2 6 f
将Country列中,index为4,5的数据进行拆分。
df = df.drop('Country', axis = 1).join(df['Country'].str.split('/', expand=True).stack().reset_index(level=1, drop=True).rename('Country'))
df.reset_index(drop=True, inplace=True)
print(df)
out:
Number Value label Country
0 100 1 a China
1 150 2 b US
2 120 3 c Japan
3 90 4 d EU
4 30 5 e UK
5 30 5 e Australia
6 2 6 f UK
7 2 6 f Netherland
对其中代码进行拆解:
#对Country列数据进行拆分,expand表示拆分后转换成DataFrame
print(df['Country'].str.split('/', expand=True))
out:
0 1
0 China None
1 US None
2 Japan None
3 EU None
4 UK Australia
5 UK Netherland
#stack用法不是很熟悉,网上的说法是将列索引转换成最内层的行索引。
#转换完成之后,发现Country数据到了一列中。
print(df['Country'].str.split('/', expand=True).stack())
out:
0 0 China
1 0 US
2 0 Japan
3 0 EU
4 0 UK
1 Australia
5 0 UK
1 Netherland
dtype: object
#使用stack转换换成后,通过reset_index重置索引,level的用法没太明白,drop=True是删除原索引。
print(df['Country'].str.split('/', expand=True).stack().reset_index(level=1, drop=True))
out:
0 China
1 US
2 Japan
3 EU
4 UK
4 Australia
5 UK
5 Netherland
dtype: object
#最后将原df中Country列删除,接上转换好的Country列
df = df.drop('Country', axis = 1).join(df['Country'].str.split('/',
expand=True).stack().reset_index(level=1, drop=True).rename('Country'))
df.reset_index(drop=True, inplace=True)
print(df)