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

时间:2017-01-01 15:33:00

标签: python pandas

我们有两个数据集,其中包含一个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中使用。

3 个答案:

答案 0 :(得分:2)

您可以连接两个DataFrame,然后将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

要从df1中提取df2df,您可以使用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

(但请注意,如果您可以将矢量化操作的性能提升一次到大型DataFrame而不是多次应用到较小的DataFrame,那么您可能最好保留df并放弃df1和{ {1}} ...)

或者,如果您必须先生成df2,然后再计算 df1['f_col1']之后,您可以df2['f_col1']使用merge加入df1df2 {/ 1}}:

col1

产量

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)

答案 1 :(得分:1)

您可以通过在http://localhost:8080/[Project PATH]

上设置索引来重复使用f_col1 df1和[{1}} map值的df2.col1
df.col1

详细

In [265]: df2.col1.map(df1.set_index('col1').f_col1)
Out[265]:
0    0
1    1
2    3
3    4

Incase,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 有多条记录,使用df1

删除记录
drop_duplicates

答案 2 :(得分:0)

您希望在两组数据中获得唯一值。然后创建一个系列或字典。这是可以在两个数据集中使用的分解。使用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