如何从熊猫数据框的多个列中获取唯一信息?

时间:2019-01-07 14:01:35

标签: python pandas

我有一个像下面这样的数据框df

  Name1      Name2  ID1  ID2
0    John    Jack    3    2
1    John  Albert    3    0
2    Jack     Eva    2    1
3  Albert    Sara    0    4
4     Eva    Sara    1    4

我想要一个两列的数据帧df1,每个ID的{​​{1}}

Name

3 个答案:

答案 0 :(得分:3)

您可以将pd.wide_to_longDataFrame.drop_duplicates一起使用以获取唯一值:

(pd.wide_to_long(df.reset_index(), stubnames=['Name','ID'], i='index', j='ix')
  .drop_duplicates().reset_index(drop=True))

     Name  ID
0    John   3
1    Jack   2
2  Albert   0
3     Eva   1
4    Sara   4

详细信息

pd.wide_to_long将使用指定的Name为您提供两列数据帧(IDstubmanes):

x = pd.wide_to_long(df.reset_index(), stubnames=['Name','ID'], i='index', j='ix')
            Name  ID
index ix            
0     1     John   3
1     1     John   3
2     1     Jack   2
3     1   Albert   0
4     1      Eva   1
0     2     Jack   2
1     2   Albert   0
2     2      Eva   1
3     2     Sara   4
4     2     Sara   4

现在,您只需要drop_duplicates即可获得Name-ID组合的唯一值:

     Name  ID
0    John   3
1    Jack   2
2  Albert   0
3     Eva   1
4    Sara   4

答案 1 :(得分:1)

使用:

v = df[['Name1','Name2']].values.ravel()
a, b = pd.factorize(v)

df = pd.DataFrame({'Name': b[a], 'ID':a}).drop_duplicates()
print (df)
     Name  ID
0    John   0
1    Jack   1
3  Albert   2
5     Eva   3
7    Sara   4

答案 2 :(得分:1)

df1=df[['ID1','Name1']].copy()
df1.rename(columns={'ID1':'ID','Name1':'Name'},inplace=True)
df2=df[['ID2','Name2']].copy()
df2.rename(columns={'ID2':'ID','Name2':'Name'},inplace=True)

new_df=pd.concat([df1,df2])
new_df.drop_duplicates(inplace=True)
new_df.sort_values(['ID'],inplace=True)
new_df.reset_index(drop=True,inplace=True)

new_df.head()

很明显,@ yatu和@jezrael的解决方案更加先进,我也学习了新的API。我的解决方案很简单,也许更容易理解。

    ID  Name
0   0   Albert
1   1   Eva
2   2   Jack
3   3   John
4   4   Sara