在两个数据之间保持相同的分解



我们有两个数据集,其中一个varialbe col1。第二个数据中缺少一些级别。例如,让

import pandas as pd
df1 = pd.DataFrame({'col1':["A","A","B","C","D","E"]})
df2 = pd.DataFrame({'col1':["A","B","D","E"]})

当我们分解df1

df1["f_col1"]= pd.factorize(df1.col1)[0]
df1

我们得到了

    col1    f_col1
0   A   0
1   A   0
2   B   1
3   C   2
4   D   3
5   E   4

但是当我们为DF2

做时
df2["f_col1"]= pd.factorize(df2.col1)[0]
df2

我们得到了

    col1    f_col1
0   A   0
1   B   1
2   D   2
3   E   3

这不是我想要的。我想在数据之间保持相同的分解,即在DF2中,我们应该有

之类的东西
    col1    f_col1
0   A   0
1   B   1
2   D   3
3   E   4

谢谢。

ps:两个数据集并非总是在同一时间可用,因此我不能围绕它们。值应存储在df1中并在DF2中使用。

您可以将两个dataframes串联,然后将pd.factorize应用于整列:

import pandas as pd
df1 = pd.DataFrame({'col1':["A","B","C","D","E"]})
df2 = pd.DataFrame({'col1':["A","B","D","E"]})
df = pd.concat({'df1':df1, 'df2':df2})
df['f_col1'], uniques = pd.factorize(df['col1'])
print(df)

产生

      col1  f_col1
df1 0    A       0
    1    B       1
    2    C       2
    3    D       3
    4    E       4
df2 0    A       0
    1    B       1
    2    D       3
    3    E       4

要从df提取df1df2,您可以使用df.loc

In [116]: df.loc['df1']
Out[116]: 
  col1  f_col1
0    A       0
1    B       1
2    C       2
3    D       3
4    E       4
In [117]: df.loc['df2']
Out[117]: 
  col1  f_col1
0    A       0
1    B       1
2    D       3
3    E       4

(但请注意,由于可以将矢量化操作的性能改善,如果您可以将它们应用于大型数据范围,而不是多次将其应用于较小的数据范围,那么您可能会更好地保持df和Ditching df1df2 ...)


另外,如果您必须先生成df1['f_col1'],然后计算 df2['f_col1']稍后,您可以使用mergecol1上加入df1df2

import pandas as pd
df1 = pd.DataFrame({'col1':["A","B","C","D","E"]})
df2 = pd.DataFrame({'col1':["A","B","D","E"]})
df1['f_col1'], uniques = pd.factorize(df1['col1'])
df2 = pd.merge(df2, df1, how='left')
print(df2)

产生

  col1  f_col1
0    A       0
1    B       1
2    D       3
3    E       4

您可以通过在 df.col1

上设置索引来重用df1map的CC_17列的CC_17列。
In [265]: df2.col1.map(df1.set_index('col1').f_col1)
Out[265]:
0    0
1    1
2    3
3    4

详细信息

In [266]: df2['f_col1'] = df2.col1.map(df1.set_index('col1').f_col1)
In [267]: df2
Out[267]:
  col1  f_col1
0    A       0
1    B       1
2    D       3
3    E       4

incase,df1有多个记录,使用drop_duplicates

删除记录
In [290]: df1
Out[290]:
  col1  f_col1
0    A       0
1    A       0
2    B       1
3    C       2
4    D       3
5    E       4
In [291]: df2.col1.map(df1.drop_duplicates().set_index('col1').f_col1)
Out[291]:
0    0
1    1
2    3
3    4
Name: col1, dtype: int32

您想在两组数据中获得唯一的值。然后创建系列或词典。这是您的分解,可以在两个数据集中使用。使用map获取您要寻找的输出。

u = np.unique(np.append(df1.col1.values, df2.col1.values))
f = pd.Series(range(len(u)), u)  # this is factorization

map

分配
df1['f_col1'] = df1.col1.map(f)
df2['f_col1'] = df2.col1.map(f)

print(df1)
  col1  f_col1
0    A       0
1    A       0
2    B       1
3    C       2
4    D       3
5    E       4

print(df2)
  col1  f_col1
0    A       0
1    B       1
2    D       3
3    E       4

最新更新