【问题标题】:pandas selected columns from second dataframe where another column's values exist in a primary dataframe熊猫从第二个数据框中选择列,其中另一列的值存在于主数据框中
【发布时间】:2017-09-16 07:37:02
【问题描述】:

我正在为一个非常具体的问题而苦苦挣扎。我有两个具有不同索引的不同长度的熊猫数据框。对于 df1 中包含的每个项目,我想查看 df2 并取几列(不包含在 df1 中),其中 df2 列之一的值等于 df1 中的值。示例:

import pandas as pd

data_1 = {'TARGET_NAME':['fishinghook', 'doorlock', 'penguin', 'ashtray', 'cat', 'elephant', 'cupcake', 'exercisebench'],
          'FOOBAR':['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar'],
          'ix':[320, 321, 322, 323, 324, 325, 326, 328]}

data_2 = {'IMAGE_NAME':['cat', 'penguin', 'jewelrybox', 'exercisebench', 'doorlock', 'jar', ],
          'VALUES_1':['h', 'h', 'c', 'm', 'h', 'f'],
          'VALUES_2':['hm', 'hl', 'cm', 'ml', 'hh', 'fl'],
          'ix':[616, 617, 618, 619, 620, 621]}

desired = {'TARGET_NAME':['fishinghook', 'doorlock', 'penguin', 'ashtray', 'cat', 'elephant', 'cupcake', 'exercisebench'],
          'FOOBAR':['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar'],
          'PRODUCED_VALUES_1':['DROPPED', 'h', 'h', 'DROPPED', 'h', 'DROPPED', 'DROPPED', 'm'],
          'ix':[320, 321, 322, 323, 324, 325, 326, 328]}

df1 = pd.DataFrame(data_1, index=data_1['ix'])
df2 = pd.DataFrame(data_2, index=data_2['ix'])
desired_df = pd.DataFrame(desired, index=desired['ix'])

df1
Out[2]: 
    FOOBAR    TARGET_NAME   ix
320    foo    fishinghook  320
321    bar       doorlock  321
322    foo        penguin  322
323    bar        ashtray  323
324    foo            cat  324
325    bar       elephant  325
326    foo        cupcake  326
328    bar  exercisebench  328

df2
Out[3]: 
        IMAGE_NAME VALUES_1 VALUES_2   ix
616            cat        h       hm  616
617        penguin        h       hl  617
618     jewelrybox        c       cm  618
619  exercisebench        m       ml  619
620       doorlock        h       hh  620
621            jar        f       fl  621

desired_df
Out[4]: 
    FOOBAR PRODUCED_VALUES_1    TARGET_NAME   ix
320    foo           DROPPED    fishinghook  320
321    bar                 h       doorlock  321
322    foo                 h        penguin  322
323    bar           DROPPED        ashtray  323
324    foo                 h            cat  324
325    bar           DROPPED       elephant  325
326    foo           DROPPED        cupcake  326
328    bar                 m  exercisebench  328

我想查看 df1['TARGET_NAME'] 中的每个值,如果它等于 df2['IMAGE_NAME'],则从 df2 获取 VALUES_1 和 VALUES_2 列并将这些详细信息添加到 df1(或 df1 的副本) .如果它在 df2 中的任何地方都不匹配(因为位置也都不同),那么我希望它写一些别的东西(例如'DROPPED')。理想情况下,我希望 df1 索引保持不变。

任何帮助表示赞赏!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过重命名列来外部合并数据,然后用您想要的列名重命名列,然后用dropped 填充produced_values 的nan 并删除nans。最后设置df1 索引。

    ndf = df1.merge(df2.rename(columns = {'IMAGE_NAME':'TARGET_NAME'}),how='outer',on='TARGET_NAME')
    ndf = ndf.drop(['ix_y','VALUES_2'],1).rename(columns={'ix_x':'ix','VALUES_1':'PRODUCED_VALUES_1'})
    
    ndf['PRODUCED_VALUES_1'] = ndf['PRODUCED_VALUES_1'].fillna('Dropped')
    ndf = ndf.dropna().set_index(df1.index)
    
    FOOBAR TARGET_NAME ix PRODUCED_VALUES_1 320 foo 钓鱼钩 320.0 Dropped 321 条门锁 321.0 h 322 富企鹅 322.0 h 323 巴烟灰缸 323.0 掉落 324 富猫 324.0 小时 325 酒吧大象 325.0 掉落 326 foo 纸杯蛋糕 326.0 Dropped 328 杆练习台 328.0 m

    【讨论】:

    • 完美!谢谢。
    • 嘿!有什么要补充的here? :)
    【解决方案2】:
    In [34]: df1['PRODUCED_VALUES_1'] = \
                 df1['TARGET_NAME'].map(df2.set_index('IMAGE_NAME')['VALUES_1']) \
                                   .fillna('DROPPED')
    
    In [35]: df1
    Out[35]:
        FOOBAR    TARGET_NAME   ix PRODUCED_VALUES_1
    320    foo    fishinghook  320           DROPPED
    321    bar       doorlock  321                 h
    322    foo        penguin  322                 h
    323    bar        ashtray  323           DROPPED
    324    foo            cat  324                 h
    325    bar       elephant  325           DROPPED
    326    foo        cupcake  326           DROPPED
    328    bar  exercisebench  328                 m
    

    或类似于@Bharath shetty 的解决方案的单线:

    In [26]: df1.merge(df2[['IMAGE_NAME','VALUES_1']].rename(columns={'IMAGE_NAME':'TARGET_NAME'}),
        ...:           how='left') \
        ...:    .fillna('DROPPED') \
        ...:    .rename(columns=lambda c: 'PRODUCED_' + c if c=='VALUES_1' else c) \
        ...:    .set_index(df1.index)
        ...:
    Out[26]:
        FOOBAR    TARGET_NAME   ix PRODUCED_VALUES_1
    320    foo    fishinghook  320           DROPPED
    321    bar       doorlock  321                 h
    322    foo        penguin  322                 h
    323    bar        ashtray  323           DROPPED
    324    foo            cat  324                 h
    325    bar       elephant  325           DROPPED
    326    foo        cupcake  326           DROPPED
    328    bar  exercisebench  328                 m
    

    【讨论】:

    • 你忘记了索引。
    • 我的第一个方法是地图,但无法得到解决方案,所以去合并。这个真的不错
    猜你喜欢
    • 2019-04-22
    • 2019-12-19
    • 1970-01-01
    • 2021-11-30
    • 2016-12-17
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多