假设我有三种数据结构:
df1
,其中A, B, C
列长度为10000 df2
,列A, some extra misc. columns...
长度为8000 labels
,其中索引i
的元素与i
中的行df2
对应。我正在尝试根据此信息创建一个数据框,对于df2.a
中的每个元素,我会抓取df1
和labels
中的相关行来配对此信息。 df2.A
中可能没有df1.A
中的条目。
目前,我通过for i in xrange(len(df2))
循环执行此操作,检查df2.A.iloc[i]
中是否存在df1.A
,如果是,则将df1.A, df1.B, df1.C, labels[i]
存储到字典中第一个元素作为键,其余元素作为列表。
是否有更有效的方法来执行此操作并将输出df1.A, df1.B, df1.C, labels[i]
存储到4列数据框中? for循环非常慢。
示例数据:
df1
A B C
'uid1' 'Bob' 'Rock'
'uid2' 'Jack' 'Pop'
'uid5' 'Cat' 'Country'
...
df2
A
'uid10'
'uid3'
'uid1'
...
labels
[label10, label3, label1, ...]
答案 0 :(得分:1)
根据我的理解,以下应该可行:
# create a new column for your labels, this will align to your index
df2['labels'] = labels
# now merge the rows from df1 on column 'A'
df2 = df2.merge(df1, on='A', how='left')
示例:
# setup my sample data
temp="""A B C
'uid1' 'Bob' 'Rock'
'uid2' 'Jack' 'Pop'
'uid5' 'Cat' 'Country'"""
temp1="""A
'uid10'
'uid3'
'uid1'"""
labels = ['label10', 'label3', 'label1']
df1 = pd.read_csv(io.StringIO(temp), sep='\s+')
df2 = pd.read_csv(io.StringIO(temp1))
In [97]:
# do the work
df2['labels'] = labels
df2 = df2.merge(df1, on='A', how='left')
df2
Out[97]:
A labels B C
0 'uid10' label10 NaN NaN
1 'uid3' label3 NaN NaN
2 'uid1' label1 'Bob' 'Rock'
这比循环
要快得多