我们有两个数据集,其中包含一个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中使用。
答案 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
中提取df2
和df
,您可以使用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
加入df1
和df2
{/ 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