我有以下数据框:
df1:
Name Tis Exr Name_2 Exr_2
A1FH derm 3.4 GHJK brn:2.4
N4RT lng 0.1 PP2DS Lvr:3.4;hup:2.3
GHJK Pap 2.2 KLM3 tet:2.0
4HHR stm 1.4 LSDR NaN
PP2DS skl 3.7 PMRT van:3.7;epth:23.5
LSDR lym 2.1 exty NaN
2BC4 lym 4.4 NaN NaN
基本上,“ Tis”和“ Exr”列是指“名称”列,而“ Exr_2”列是指“名称_2”列。
我正在尝试对数据框进行排序,如果“名称”列中的行与“名称_2”列中的行匹配,则它们将移至同一行-上面各列中的数据也是如此。保留不匹配的行,但在不匹配的行中将其列为NaN。我正在按字母顺序进行操作。
所需的输出:
df2:
Name Tis Exr Name_2 Exr_2
GHJK Pap 2.2 GHJK brn:2.4
LSDR lym 2.1 LSDR NaN
PP2DS skl 3.7 PP2DS Lvr:3.4;hup:2.3
2BC4 lym 4.4 NaN NaN
4HHR stm 1.4 NaN NaN
A1FH derm 3.4 NaN NaN
NaN NaN NaN exty NaN
NaN NaN NaN KLM3 tet:2.0
N4RT lng 0.1 NaN NaN
NaN NaN NaN PMRT van:3.7;epth:23.5
我尝试了许多不同的事情:
df1 = pd.read_csv('dataset.csv', error_bad_lines=False, sep = '\t')
df2 = df1.sort_values(['Name', 'Name_2'], ascending =[False, True])
尝试:
df1[df1.Name==df1.Name_2]
我也尝试过在Linux命令行上使用各种工具,但是使用Pandas似乎更好,因为我对Python更加熟悉。
我的数据框超过41,000行。
答案 0 :(得分:0)
您可以将数据分为两个单独的数据帧,并使用df.merge
来匹配名称。
df2 = df1[['Name', 'Tis', 'Exr']].sort_values('Name')
df_temp = df1[['Name_2', 'Exr_2']]
df2 = df2.merge(df_temp, left_on='Name', right_on='Name_2', how='outer')
del df_temp
print(df2)
输出
Name Tis Exr Name_2 Exr_2
0 2BC4 lym 4.4 NaN NaN
1 4HHR stm 1.4 NaN NaN
2 A1FH derm 3.4 NaN NaN
3 GHJK Pap 2.2 GHJK brn:2.4
4 LSDR lym 2.1 LSDR NaN
5 N4RT lng 0.1 NaN NaN
6 PP2DS skl 3.7 PP2DS Lvr:3.4;hup:2.3
7 NaN NaN NaN KLM3 tet:2.0
8 NaN NaN NaN PMRT van:3.7;epth:23.5
9 NaN NaN NaN exty NaN
10 NaN NaN NaN NaN NaN