通过子字符串和排序加入数据框

时间:2018-06-21 13:46:06

标签: python pandas merge substring

我希望将一些数据从一个数据框追加到另一个。 问题是我需要构建一个密钥,以便能够在两个数据框之间映射值。 所以我建立了一个示例,用df1有一列“ RAW”。此列包含一个需要拆分的字符串,左起第三个字符,右起第3个字符,然后按字母顺序排序。意思是如果“ RAW”是“ RTYdfhgvisdhQWE”,我要使用的字符串是QWERTY。 然后需要使用CODE和DATE将其映射到df2中的正确CODE。

import pandas as pd

df1 = pd.DataFrame(columns=["RAW", "DATE", "VALUE"])

df1.at[0, 'RAW'] = 'QWE/RTY'
df1.at[0, 'DATE'] = '2012-01-01'
df1.at[0, 'VALUE'] = 'TEST0'
df1.at[1, 'RAW'] = 'RTY/AZE'
df1.at[1, 'DATE'] = '2015-06-11'
df1.at[1, 'VALUE'] = 'TEST1'

df2 = pd.DataFrame(columns=["CODE", "DATE", "RES"])
df2.at[0, 'CODE'] = 'QWERTY'
df2.at[0, 'DATE'] = '2012-03-01'
df2.at[0, 'RES'] = 1.1
df2.at[0, 'CODE'] = 'QWERTY'
df2.at[0, 'DATE'] = '2012-01-01'
df2.at[0, 'RES'] = 1.3
df2.at[1, 'CODE'] = 'AZERTY'
df2.at[0, 'DATE'] = '2012-06-11'
df2.at[1, 'RES'] = 1.4


def buildcodefromrow(mystring):
    return [ mystring[0:3] + mystring[4:3] if  mystring[0:2] < mystring[4:6] else  mystring[4:6] + mystring[0:2]]

df1['BUILTCODE'] = buildcodefromrow(df1['RAW'])
df1 = pd.merge(df1, df2,  left_on=['BUILTCODE', 'DATE'], right_on=['CODE', 'DATE'])

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

将您的buildcodefromrow函数更改为以下内容:

def buildcodefromrow(mystring):
    return mystring[0:3] + mystring[4:] if  mystring[0:3] < mystring[4:] else  mystring[4:] + mystring[0:3]

和df1中的BUILTCODE行可以使用:

df1['BUILTCODE'] = df1['RAW'].apply(buildcodefromrow)

合并的df1应该如下所示:

    RAW      DATE       VALUE   BUILTCODE  CODE     RES
0   QWE/RTY 2012-01-01  TEST0   QWERTY     QWERTY   1.3
1   RTY/AZE 2015-06-11  TEST1   AZERTY     AZERTY   1.4

如果这不是您期望的输出,请使用期望的输出编辑您的问题。 谢谢