python - Pandas :难以理解合并的工作原理

标签 python pandas

我在合并方面做错了,我不明白它是什么。我已完成以下操作来估计一系列整数值的直方图:

import pandas as pnd
import numpy  as np

series = pnd.Series(np.random.poisson(5, size = 100))
tmp  = {"series" : series, "count" : np.ones(len(series))}
hist = pnd.DataFrame(tmp).groupby("series").sum()
freq = (hist / hist.sum()).rename(columns = {"count" : "freq"})

如果我打印 histfreq 这就是我得到的:

> print hist
        count
series       
0           2
1           4
2          13
3          15
4          12
5          16
6          18
7           7
8           8
9           3
10          1
11          1

> print freq 
        freq
series      
0       0.02
1       0.04
2       0.13
3       0.15
4       0.12
5       0.16
6       0.18
7       0.07
8       0.08
9       0.03
10      0.01
11      0.01

它们都由 "series" 索引,但如果我尝试合并:

> df   = pnd.merge(freq, hist, on = "series")

我收到一个 KeyError: 'no item named series' 异常。如果我省略 on = "series",我会得到一个 IndexError: list index out of range 异常。

我不明白我做错了什么。可能是“系列”是索引而不是列,所以我必须以不同的方式来做?

最佳答案

来自 docs :

on: Columns (names) to join on. Must be found in both the left and right DataFrame objects. If not passed and left_index and right_index are False, the intersection of the columns in the DataFrames will be inferred to be the join keys

我不知道为什么这不在文档字符串中,但它解释了你的问题。

你可以给 left_indexright_index:

In : pnd.merge(freq, hist, right_index=True, left_index=True)
Out:
        freq  count
series
0       0.01      1
1       0.04      4
2       0.14     14
3       0.12     12
4       0.21     21
5       0.14     14
6       0.17     17
7       0.07      7
8       0.05      5
9       0.01      1
10      0.01      1
11      0.03      3

或者你可以让你的索引成为一个列并使用on:

In : freq2 = freq.reset_index()

In : hist2 = hist.reset_index()

In : pnd.merge(freq2, hist2, on='series')
Out:
    series  freq  count
0        0  0.01      1
1        1  0.04      4
2        2  0.14     14
3        3  0.12     12
4        4  0.21     21
5        5  0.14     14
6        6  0.17     17
7        7  0.07      7
8        8  0.05      5
9        9  0.01      1
10      10  0.01      1
11      11  0.03      3

或者更简单地,DataFramejoin完全符合您要求的方法:

In : freq.join(hist)
Out:
        freq  count
series
0       0.01      1
1       0.04      4
2       0.14     14
3       0.12     12
4       0.21     21
5       0.14     14
6       0.17     17
7       0.07      7
8       0.05      5
9       0.01      1
10      0.01      1
11      0.03      3

关于python - Pandas :难以理解合并的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145224/

相关文章:

python - 如何从 pandas 正确导入 scatter_matrix() 函数?

python - 为什么 Python 的 MIMEMultipart 生成带有换行符的附件文件名?

python - 在python中匹配两个 Pandas 数据框的列名

python - 数据集在 Pandas 数据框中每月有多少天有记录?

python - 我可以对 df.column 的元素进行分类并创建一个不带迭代输出的列(Python-Pandas-Np)吗?

python - 如何让 PyC​​harm 识别自定义属性装饰器?

python - 如何在两个类之间调用方法?

python - 在模块内使用 __init__.py 中定义的方法

python - 以不寻常的方式对 Pandas 数据框进行分组

python - 将 statsmodels 摘要对象转换为 Pandas Dataframe