Как суммировать строки с одинаковыми ключами? - PullRequest
0 голосов
/ 08 июня 2018

В моем коде df определяется следующим образом

df = pd.read_excel(io=file_name, sheet_name=sheet, sep='\s*,\s*')

У меня есть [86 rows x 1 columns] датафрейм df, который выглядит следующим образом на print(df)

          0
Male    511
Female  461
Male    273
Female  217
Male    394
Female  337
Female  337
Male    337
...

Я хотел бы написать код, который будет merge Male и Female записей, как это

          0   1   2   3 ...
Male    511 273 394 337 ...
Female  461 217 337 337 ...

Последняя задача, которую мне нужно сделать, это .sum() мужской ряд, а затем женскийстрока, чтобы получить сумму каждого пола.Я новичок в Python и пандах, и я не смог добиться большого прогресса до сих пор.Любая помощь, учебник, документация была бы отличной!Спасибо!

Редактировать: Под keys Я имею в виду индексы.Я надеюсь, что эти ярлыки Мужчин и Женщин можно использовать для «объединения» этих рядов вместе, но я не знаю, как это сделать.

Редактировать: я выполнил свое последнее задание напрямую через

print(df.ix['Female'].sum())
print(df.ix['Male'].sum())

Но я еще не выполнил свою первую задачу.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы можете использовать concat + transpose:

cats = ['Male', 'Female']

res = pd.concat([pd.DataFrame(group.values) for _, group in df.groupby(level=0)],
                axis=1, ignore_index=True)\
        .rename(columns=dict(enumerate(cats)))\
        .transpose()

print(res)

          0    1    2    3
Male    511  273  394  337
Female  461  217  337  337

Тест производительности

concat + transpose, по-видимому, в ~ 4 раза лучшечем cumcount + unstack.Обычно это не так, но это правда, когда у нас небольшое количество больших групп, например, здесь.

def jpp(df):
    cats = ['Male', 'Female']
    res = pd.concat([pd.DataFrame(group.values) for _, group in df.groupby(level=0)],
                    axis=1, ignore_index=True)\
            .rename(columns=dict(enumerate(cats)))\
            .transpose()
    return res

def jez(df):    
    df.index = [df.index, df.groupby(level=0).cumcount()]
    df = df[0].unstack()
    return df

df2 = pd.concat([df]*10000)

%timeit jpp(df2.copy())  # 12 ms
%timeit jez(df2.copy())  # 52.7ms
0 голосов
/ 08 июня 2018

Создать MultiIndex с помощью GroupBy.cumcount для новых имен столбцов, созданных путем изменения формы на unstack:

df.index = [df.index, df.groupby(level=0).cumcount()]

print (df)
            0
Male   0  511
Female 0  461
Male   1  273
Female 1  217
Male   2  394
Female 2  337
       3  337
Male   3  337

df = df[0].unstack()
print (df)
          0    1    2    3
Female  461  217  337  337
Male    511  273  394  337

А затем sum все строки по axis=1:

print (df.sum(axis=1))

Female    1352
Male      1515
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...