根据熊猫中的条件将一个数据框的列追加到另一个

时间:2019-12-20 17:33:03

标签: python-3.x pandas

我有一个具有以下设置的csv文件:

  col0 col1     col2 col3  col4
    0    A       12   22    23
    1    B       40   59    63
    2    F       76   81    99
    3    J       10   11    12
    4    A       20   15    43

df = pd.read_csv('foo.csv,dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')

# col0 represents pandas default indexing
# This dataframe contains 230 rows

我还有另一个具有以下设置的csv文件:

col0 colx coly colz colz1

 0    A    12   211   313 
 1    J    44   222   134
 2    A    33   344   277
 3    B    456  344   333

df2 = pd.read_csv('foo2.csv,dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')

# I have 14 rows in this dataframe. 

目标是检查col1是否与colx匹配,然后我希望代码将coly,colz,colz1附加到第一个数据帧。例如,

  col0 col1   col2 col3   col4  col5 col6  col7 
    0    A       12   22    23   12   211  313
    1    B       40   59    63   
    2    F       76   81    99
    3    J       10   11    12   44   222  134
    4    A       20   15    43

# I have left some rows blank just to highlight 'A' and 'J'.

这是我能想到的更合理的解决方案之一。

def add_multiple_columns(x):

    df2 = pd.read_csv('foo2.csv', dtype='object', sep=r'\s*,\s*', engine='python')

    df2 = df2.apply(lambda y: y['coly', 'colz', 'colz1'] if x['col1'] == y['colx'] else None, axis=1)


    df2 = df2.dropna(axis=0, how='all')

    if df2.empty:

        df2 = 0

    else:

        df2 = df2.to_string(index=False)

    return df2


df['col5', 'col6', 'col7'] = df.apply(add_multiple_columns, axis=1)

这段代码会导致混乱的回溯,我什至不确定是否要发布整个内容。我唯一了解的是存在一个* type错误,'str'对象无法解释为整数和 KeyError:('(''col1','发生在索引0','发生在索引0 ')

请记住,我在两个数据帧中没有相等数量的行,因此,在多个实例中,第一个数据帧中的行需要从第二个数据帧中追加相同数量的行。我该如何工作?

1 个答案:

答案 0 :(得分:0)

我看到df2 colx中有多行是A,并且您将第一行与A匹配,因此我删除了重复项并保留了第一个值。这会进行左合并,这将为您提供所需的行为。我在您的输出中注意到您在B上不匹配,应该在B上匹配,对吧?

df = pd.read_csv('foo.csv',dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
df2 = pd.read_csv('foo2.csv',dtype='object',sep=r'\s*,\s*',engine='python',encoding='ascii')
temp = df2[['colx', 'coly', 'colz', 'colz1']] # this drops col0
temp = temp.drop_duplicates(subset='colx', keep='first') # This is to drop duplicate values for colx
df3 = df.merge(temp,on_left='col1', on_right='colx', how='left')
df3 = df3.rename(columns = {'coly':'col5', 'colz':'col6', 'colz1':'col7'})