我的第一个DataFrame看起来如下:
ESD Species Key1
Sub POAP SubPOAP
Sub FRAP SubFRAP
Sand POAP SandPOAP
Sand ACER SandACER
Sand SALI SandSALI因此,Key1是静电放电和物种的连接。
我的第二个DataFrame看起来如下:
ESD Species Values Key
Sub POAP 10 SubPOAP
Sub FRAP 20 SubFRAP因此,我想将第二帧加入到基于Key1和Key的第一个框架中,但是第一个DataFrame更大,我仍然希望在新的DataFrame中保留不匹配的列(用ESD作为沙子)。最后,我将合并任何与ESD的沙子也。
到目前为止,我已经使用了这段代码,并将'Key1‘和'Key’设置为索引:
merge=pd.merge(df, df2, left_index='True', right_index='True') 但这不会保留没有匹配键的列。也许我需要的是一个连接而不是一个合并吗?
这一守则的结果是:
ESD Species Key1 Values
Sub POAP SubPOAP 10
Sub FRAP SubFRAP 20期望的输出是:
ESD Species Key1 Values
Sub POAP SubPOAP 10
Sub FRAP SubFRAP 20
Sand POAP SandPOAP NaN
Sand ACER SandACER NaN
Sand SALI SandSALI NaN我并不关心重复的列标题是否会传递到联接中,我将只删除它们(有两个列命名为物种)。
发布于 2015-06-06 19:31:44
与其将ESD和Species连接到一个字符串中,不如在列列表上合并:
result = pd.merge(df, df2, on=['ESD', 'Species'], how='left')若要在result中为df中的每一行保留一行(即执行左连接。),请使用how='left'。
import pandas as pd
try:
# for Python2
from cStringIO import StringIO
except ImportError:
# for Python3
from io import StringIO
df = pd.read_table(StringIO('''\
ESD Species Key1
Sub POAP SubPOAP
Sub FRAP SubFRAP
Sand POAP SandPOAP
Sand ACER SandACER
Sand SALI SandSALI'''), sep='\s+')
df2 = pd.read_table(StringIO('''\
ESD Species Values Key
Sub POAP 10 SubPOAP
Sub FRAP 20 SubFRAP'''), sep='\s+')
result = pd.merge(df, df2, on=['ESD', 'Species'], how='left')
print(result)收益率
ESD Species Key1 Values Key
0 Sub POAP SubPOAP 10 SubPOAP
1 Sub FRAP SubFRAP 20 SubFRAP
2 Sand POAP SandPOAP NaN NaN
3 Sand ACER SandACER NaN NaN
4 Sand SALI SandSALI NaN NaN注意,如果df是这样的,
ESD Species Key1
FOO BAR FOOBAR
FOOB AR FOOBAR然后两个不同的(ESD, Species)对可以映射到相同的Key1 --即FOOBAR。因此,串连字符串以产生用于合并的键可能会导致错误。
这可能影响您,也可能不会影响您,但由于理论上它可能导致错误,而且由于您可以直接在['ESD', 'Species']上合并,所以最好避免连接。
https://stackoverflow.com/questions/30686657
复制相似问题