熊猫:从多个数据帧,数组中加入信息

时间:2014-10-16 08:05:13

标签: pandas dataframe

假设我有三种数据结构:

  1. 数据框df1,其中A, B, C列长度为10000
  2. 数据框df2,列A, some extra misc. columns...长度为8000
  3. 长度为8000的Python列表labels,其中索引i的元素与i中的行df2对应。
  4. 我正在尝试根据此信息创建一个数据框,对于df2.a中的每个元素,我会抓取df1labels中的相关行来配对此信息。 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, ...]
    

1 个答案:

答案 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'

这比循环

要快得多