Python 数据帧中的拆分和排序值
我有一个原始数据帧,例如:Python 数据帧中的拆分和排序值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个原始数据帧,例如: Data 0 XZ_1A-2A 1 XZ_3C 2 XZ_4B-5A 3 XZ_18A-20C 我想把它拆分并删除 然后按数字排序 T1 T2 0 2A 1A 1 3C 2 5A 4B 3 20C 18A 谢谢你的帮助 [固定] 更新1: 输入数据时: Data 0 XZ_17A-1A 1 XZ_5C 2 XZ_3
Data
0 XZ_1A-2A
1 XZ_3C
2 XZ_4B-5A
3 XZ_18A-20C
我想把它拆分并删除
然后按数字排序
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
谢谢你的帮助
[固定]
更新1:
输入数据时:
Data
0 XZ_17A-1A
1 XZ_5C
2 XZ_3A-28A
并用
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
asc=pd.DataFrame(np.sort(df[['T1','T2']],axis=1))
des= asc[asc.columns.values[::-1]]
我得到了输出
1 0
0 1A 17A
1 5C
2 3A 28A
更新2:
如果在同一行中有2个以上的项目约1~5,如何排序
Data
0 XZ_17A-1A
1 XZ_5C
2 XZ_3A-28A
3 XZ_5A-19A-42C
4 XZ_3A-28A-41A-42A
采取以下步骤: 使用.ixnum获取行num处的值。 使用.Split'-'拆分连字符上的值 添加if语句以检查数组中的元素数,并相应地创建数据帧。
希望这会有所帮助。采取以下步骤: 使用.ixnum获取行num处的值。 使用.Split'-'拆分连字符上的值 添加if语句以检查数组中的元素数,并相应地创建数据帧。 希望这能有所帮助。试试这个:
df= df['Data'].str.split('_|-',expand=True)[[1,2]]
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
要获得排序值,请使用以下命令:
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
asc= df.apply(np.sort,axis=1)
asc=pd.DataFrame(np.sort(df[['T1','T2']],axis=1)) #alternative way
des= asc[asc.columns.values[::-1]]
print des
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
说明:
a清理数据后,使用np.sort,axis=1,根据行值按升序对数据框进行排序
b要获得降序,请反转列顺序
c使用fillna得到准确的结果
编辑:
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
有关多列,请参见下面的示例
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
df['n1']=df['T1'].str.extract('(\d+)').astype(float)
df['n2']=df['T2'].str.extract('(\d+)').astype(float)
df['n3']=[432,4,15]
res=pd.DataFrame()
res['result'] =df.apply(lambda x: sorted([x['n1'],x['n2'],x['n3']],reverse=True),axis=1)
res[['T1','T2','T3']]=res['result'].astype(str).str.replace("\[|\]|'",'').str.split(',',expand=True)
输入:
T2 T1 n1 n2 n3
0 17A 1A 1.0 17.0 432
1 5C NaN 5.0 4
2 3A 28A 28.0 3.0 15
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
试试这个:
df= df['Data'].str.split('_|-',expand=True)[[1,2]]
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
要获得排序值,请使用以下命令:
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
asc= df.apply(np.sort,axis=1)
asc=pd.DataFrame(np.sort(df[['T1','T2']],axis=1)) #alternative way
des= asc[asc.columns.values[::-1]]
print des
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
说明:
a清理数据后,使用np.sort,axis=1,根据行值按升序对数据框进行排序
b要获得降序,请反转列顺序
c使用fillna得到准确的结果
编辑:
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
有关多列,请参见下面的示例
df= (df['Data'].str.split('_|-',expand=True)[[1,2]]).rename(columns={1:'T2',2:'T1'}).fillna('')
df['n1']=df['T1'].str.extract('(\d+)').astype(float)
df['n2']=df['T2'].str.extract('(\d+)').astype(float)
df['n3']=[432,4,15]
res=pd.DataFrame()
res['result'] =df.apply(lambda x: sorted([x['n1'],x['n2'],x['n3']],reverse=True),axis=1)
res[['T1','T2','T3']]=res['result'].astype(str).str.replace("\[|\]|'",'').str.split(',',expand=True)
输入:
T2 T1 n1 n2 n3
0 17A 1A 1.0 17.0 432
1 5C NaN 5.0 4
2 3A 28A 28.0 3.0 15
输出:
1 2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
T1 T2
0 2A 1A
1 3C
2 5A 4B
3 20C 18A
result T1 T2
0 [17A, 1A] 17A 1A
1 [5C, None] 5C
2 [28A, 3A] 28A 3A
result T1 T2 T3
0 [432, 17.0, 1.0] 432 17.0 1.0
1 [nan, 5.0, 4] nan 5.0 4
2 [28.0, 15, 3.0] 28.0 15 3.0
最简单的方法是:
df1 = data["Data"].str.split("-", n = 1, expand = True)
output:
0 1
0 XZ_1A 2A
1 XZ_3C None
2 XZ_4B 5A
3 XZ_18A 20C
df2 = df1[0].str.split("_", n = 1, expand = True)
output :
0 1
0 XZ 1A
1 XZ 3C
2 XZ 4B
3 XZ 18A
data["T1"]= df2[1]
data["T2"]= df1[1]
最后你得到了:
Data T1 T2
0 XZ_1A-2A 1A 2A
1 XZ_3C 3C None
2 XZ_4B-5A 4B 5A
3 XZ_18A-20C 18A 20C
最简单的方法是:
df1 = data["Data"].str.split("-", n = 1, expand = True)
output:
0 1
0 XZ_1A 2A
1 XZ_3C None
2 XZ_4B 5A
3 XZ_18A 20C
df2 = df1[0].str.split("_", n = 1, expand = True)
output :
0 1
0 XZ 1A
1 XZ 3C
2 XZ 4B
3 XZ 18A
data["T1"]= df2[1]
data["T2"]= df1[1]
最后你得到了:
Data T1 T2
0 XZ_1A-2A 1A 2A
1 XZ_3C 3C None
2 XZ_4B-5A 4B 5A
3 XZ_18A-20C 18A 20C
试试
使用重命名功能替换列名,如下所示
>>> newdf.rename(columns={1: 'T1', 2: 'T2'}, inplace=True)
>>> newdf
T1 T2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
但是,如果还希望将None替换为空字符串,则可以如下所示:
>>> newdf['T2'].fillna(value='', inplace=True)
>>> newdf
T1 T2
0 1A 2A
1 3C
2 4B 5A
3 18A 20C
试试
使用重命名功能替换列名,如下所示
>>> newdf.rename(columns={1: 'T1', 2: 'T2'}, inplace=True)
>>> newdf
T1 T2
0 1A 2A
1 3C None
2 4B 5A
3 18A 20C
但是,如果还希望将None替换为空字符串,则可以如下所示:
>>> newdf['T2'].fillna(value='', inplace=True)
>>> newdf
T1 T2
0 1A 2A
1 3C
2 4B 5A
3 18A 20C
@MohamedThasinah谢谢,这很有效。但我发现还有一个问题:它似乎只对第一个数字排序。例如:当值为3和28时,排序后我将在第一列得到3对不起,还有一个问题:如果一行中有两个以上的项需要排序,那么我如何更改此行res['result']=df.apply…然后您必须按降序对行进行排序,并将值存储在同一列表中。如果我有空的话,我会把它更新到我的解决方案中,再问一个问题。有没有办法让多列排序的输出是数字+字母的格式,就像两列排序的输出一样columns@xiumpt-不,你得不到,你会失去订单的。@MohamedThasinah谢谢,它有效。但我发现还有一个问题:它似乎只对第一个数字排序。例如:当值为3和28时,排序后我将在第一列得到3对不起,还有一个问题:如果一行中有两个以上的项需要排序,那么我如何更改此行res['result']=df.apply…然后您必须按降序对行进行排序,并将值存储在同一列表中。如果我有空的话,我会把它更新到我的解决方案中,再问一个问题。有没有办法让多列排序的输出是数字+字母的格式,就像两列排序的输出一样columns@xiumpt-不,你得不到,你会失去订单的。