我们有两个数据集,其中一个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
提取df1
和df2
,您可以使用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 df1
和df2
...)
另外,如果您必须先生成df1['f_col1']
,然后计算 df2['f_col1']
稍后,您可以使用merge
在col1
上加入df1
和df2
:
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
df1
和map
的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