Pandas DataFrame,如何将重复的列相加?

5

我有一个非常大的DataFrame,其中有重复的列,但其下的值并不重复。我想将重复的列合并在一起,并将数值相加。

这个非常大的DataFrame是通过将Series连接在一起创建的,这就是重复出现的原因。

       Py Java Ruby C  Ruby
2010    1   5   8   1   5
2011    5   5   1   9   8
2012    1   5   8   2   8
2013    6   3   8   1   9
2014    4   8   9   9   9

我想将两个 Ruby 列相加,以获得以下结果:

       Py Java Ruby C  Ruby
2010    1   5   13  1   5
2011    5   5   9   9   8
2012    1   5   16  2   8
2013    6   3   17  1   9
2014    4   8   18  9   9

我正在运行 Python 2.7 版本。

2个回答

13

我建议使用groupby:

df = df.groupby(axis=1, level=0).sum()

为了使其也适用于MultiIndex,可以这样做:

if df.columns.duplicated().any():
    all_levels = df.columns.nlevels
    if all_levels > 1:
        all_levels = range(all_levels)
    df = df.groupby(axis=1, level=all_levels).sum()

编辑

现在可以简单地使用以下代码而不是使用groupby:

df = df.sum(axis=1, level=0)

请注意 NaN 值,它们将被上述过程转换为 0。为避免此情况,可以使用 skipna=Falsemin_count=1(具体根据用例而定):

df = df.sum(axis=1, level=0, skipna=False)

2

如果你要对这些值进行求和,我不确定为什么你想要保存旧的列,所以这里有一种方法可以这样做:

df = pd.DataFrame({'col1':x, 'col2':y, 'col3':z}, index=a)
df.columns = ['Ruby', 'Python', 'Ruby']
df['Ruby'] = df['Ruby'].sum(axis=1)
df = df.T.drop_duplicates()
df = df.T

有一个起始数据框,看起来像:

        Ruby  Python  Ruby
2010     1       2     1
2011     2       4     3
2012     3       6     5
2013     4       8     7
2014     5      10     9

然后变成:
        Ruby  Python
2010     2       2
2011     5       4
2012     8       6
2013    11       8
2014    14      10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接