您好我有以下数据框:
> df1
id begin conditional confidence discoveryTechnique
0 278 56 false 0.0 1
1 421 18 false 0.0 1
> df2
concept
0 A
1 B
如何合并索引以获取:
id begin conditional confidence discoveryTechnique concept
0 278 56 false 0.0 1 A
1 421 18 false 0.0 1 B
我问,因为我理解merge()
即df1.merge(df2)
使用列进行匹配。事实上,我这样做了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
self._validate_specification()
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on
合并索引是不好的做法?这不可能吗?如果是这样,我如何将索引转换为名为“index”的新列?
由于
答案 0 :(得分:187)
使用merge
,默认为内连接:
pd.merge(df1, df2, left_index=True, right_index=True)
或join
,默认情况下是左连接:
df1.join(df2)
或concat
,默认为外连接:
pd.concat([df1, df2], axis=1)
<强>样品强>:
df1 = pd.DataFrame({'a':range(6),
'b':[5,3,6,9,2,4]}, index=list('abcdef'))
print (df1)
a b
a 0 5
b 1 3
c 2 6
d 3 9
e 4 2
f 5 4
df2 = pd.DataFrame({'c':range(4),
'd':[10,20,30, 40]}, index=list('abhi'))
print (df2)
c d
a 0 10
b 1 20
h 2 30
i 3 40
#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
a b c d
a 0 5 0 10
b 1 3 1 20
#default left join
df4 = df1.join(df2)
print (df4)
a b c d
a 0 5 0.0 10.0
b 1 3 1.0 20.0
c 2 6 NaN NaN
d 3 9 NaN NaN
e 4 2 NaN NaN
f 5 4 NaN NaN
#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
a b c d
a 0.0 5.0 0.0 10.0
b 1.0 3.0 1.0 20.0
c 2.0 6.0 NaN NaN
d 3.0 9.0 NaN NaN
e 4.0 2.0 NaN NaN
f 5.0 4.0 NaN NaN
h NaN NaN 2.0 30.0
i NaN NaN 3.0 40.0
答案 1 :(得分:20)
您可以使用concat([df1, df2, ...], axis=1)来连接两个或多个由索引对齐的DF:
pd.concat([df1, df2, df3, ...], axis=1)
或merge用于连接自定义字段/索引:
# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])
# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)
或join按索引加入:
df1.join(df2)
答案 2 :(得分:5)
这个答案已经解决了一段时间,所有可用的 选项已经在那里了。但是在这个答案中,我会尝试 对这些选项有更多的了解,以帮助您了解何时该 用什么。
这篇文章将讨论以下主题:
merge
、join
、concat
有几个选项,根据用途,有些比其他的更简单 案例。
DataFrame.merge
与 left_index
和 right_index
(或使用命名索引的 left_on
和 right_on
)DataFrame.join
(连接索引)pd.concat
(连接索引)优点 | 缺点 | |
---|---|---|
merge |
• 支持内/左/右/全 |
• 一次只能连接两帧 |
join |
• 支持inner/left(默认)/right/full |
• 仅支持索引索引连接 |
concat |
• 擅长一次连接多个 DataFrame |
• 仅支持内部/完整(默认)连接 |
通常,索引内连接如下所示:
left.merge(right, left_index=True, right_index=True)
其他类型的连接(左、右、外)遵循类似的语法(并且可以使用 how=...
进行控制)。
值得注意的替代方案
DataFrame.join
默认为索引的左外连接。
left.join(right, how='inner',)
如果您碰巧得到 ValueError: columns overlap but no suffix specified
,则需要指定 lsuffix
和 rsuffix=
参数来解决此问题。由于列名相同,因此需要区分后缀。
pd.concat
连接索引,并且可以一次连接两个或多个 DataFrame。默认情况下,它会执行完整的外部联接。
pd.concat([left, right], axis=1, sort=False)
有关 concat
的详细信息,请参阅 this post。
要使用左索引、右列执行内连接,您将使用 DataFrame.merge
和 left_index=True
和 right_on=...
的组合。
left.merge(right, left_index=True, right_on='key')
其他连接遵循类似的结构。请注意,仅 merge
可以执行索引到列连接。您可以连接多个级别/列,前提是左侧的索引级别数等于右侧的列数。
join
和 concat
不能混合合并。您将需要使用 DataFrame.set_index
将索引设置为预先步骤。
这篇文章是我在 Pandas Merging 101 工作的删节版。有关合并的更多示例和其他主题,请点击此链接。
答案 3 :(得分:1)
如果要在熊猫中加入两个数据框,则可以简单地使用merge
或concatenate
之类的可用属性。
例如,如果我有两个数据框df1
和df2
,则可以通过以下方式加入它们:
newdataframe=merge(df1,df2,left_index=True,right_index=True)
答案 4 :(得分:1)
一个愚蠢的错误吸引了我:由于索引dtypes不同,连接失败。这不是很明显,因为两个表都是同一原始表的数据透视表。在reset_index之后,索引在jupyter中看起来相同。仅在保存为excel时才显示出来...
已修复:df1[['key']] = df1[['key']].apply(pd.to_numeric)
希望这可以节省一个小时!
答案 5 :(得分:0)
默认情况下:
join是列式左连接
pd.merge是按列的内部联接
pd.concat是按行的外部联接
pd.concat:
带有Iterable参数。因此,它不能直接采用DataFrames(使用[df,df2])
DataFrame的尺寸应沿轴
加入并合并:
可以接受DataFrame参数