Сбор сводной статистики по фрейму данных, построенному путем случайной выборки других фреймов данных

#python #loops #pandas #dictionary

#python #циклы #pandas #словарь

Вопрос:

Моя цель — создать фрейм данных путем случайной выборки из других фреймов данных, сбора сводной статистики по новому фрейму данных, а затем добавить эту статистику в список. В идеале я могу повторить этот процесс n раз (например, bootstrap).

 dfposlist = [OFdf, Firstdf, Seconddf, Thirddf, CFdf, RFdf, Cdf, SSdf]

OFdf.head()
    playerID    OPW         POS salary
87  bondsba01   62.061290   OF  8541667
785 ramirma02   35.785630   OF  13050000
966 walkela01   30.644305   OF  6050000
859 sheffga01   29.090699   OF  9916667
357 gilesbr02   28.160054   OF  7666666
 

Все фреймы данных в списке имеют одинаковые заголовки. То, что я пытаюсь сделать, выглядит примерно так:

 teamdist = []
for df in dfposlist:
    frames = [df.sample(n=1)]
team = pd.concat(frames)

teamopw = team['OPW'].sum()
teamsal = team['salary'].sum()
teamplayers = team['playerID'].tolist()

teamdic = {'Salary':teamsal, 'OPW':teamopw, 'Players':teamplayers}
teamdist.append(teamdic)
 

Результат, который я ищу, выглядит примерно так:

 teamdist = [{'Salary':4900000, 'OPW':78.452, 'Players':[bondsba01, etc, etc]}]
 

Но по какой-то причине все действия sum, подобные teamopw = team['OPW'].sum() не работают так, как мне хотелось бы, и просто возвращают элементы в team['OPW']

 print(teamopw)
0.17118131814601256
38.10700006434629
1.5699939126695253
32.9068837019903
16.990760776263674
18.22428871113601
13.447706356730897
 

Любые советы о том, как заставить это работать? Спасибо!

Редактировать: рабочее решение следующим образом. Не уверен, что это самый питонический способ, но он работает.

 teamdist = []
team = pd.concat([df.sample(n=1) for df in dfposlist])

teamopw = team[['OPW']].values.sum()
teamsal = team[['salary']].values.sum()
teamplayers = team['playerID'].tolist()

teamdic = {'Salary':teamsal, 'OPW':teamopw, 'Players':teamplayers}
teamdist.append(teamdic)
 

Комментарии:

1. Я не могу воссоздать проблему. Все ли итерации таковы? Проверьте, в какой момент вы печатаете. Есть ли другая операция, которую вы выполняете с этой серией? И зачем объединять одну запись одного фрейма данных или ваш отступ отключен в post?

Ответ №1:

Здесь (со случайными данными):

 import pandas as pd
import numpy as np

dfposlist = dict(zip(range(10),
                     [pd.DataFrame(np.random.randn(10, 5),
                                   columns=list('abcde'))
                     for i in range(10)]))
for df in dfposlist.values():
    df['f'] = list('qrstuvwxyz')

teamdist = []
team = pd.concat([df.sample(n=1) for df in dfposlist.values()])
print(team.info())

teamdic = team[['a', 'c', 'e']].sum().to_dict()
teamdic['f'] = team['f'].tolist()
teamdist.append(teamdic)
print(teamdist)

# Output:
## team.info():
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 1 to 6
Data columns (total 6 columns):
a    10 non-null float64
b    10 non-null float64
c    10 non-null float64
d    10 non-null float64
e    10 non-null float64
f    10 non-null object
dtypes: float64(5), object(1)
memory usage: 560.0  bytes
None

## teamdist:
[{'a': -3.5380097363724601,
  'c': 2.0951152809401776,
  'e': 3.1439230427971863,
  'f': ['r', 'w', 'z', 'v', 'x', 'q', 't', 'q', 'v', 'w']}]
 

Комментарии:

1. Как бы вы поступили со строками? Скажем, если заголовок b был строками, а желаемый результат 'b':[strA, strB, strC, etc]

2. Вы хотели получить сумму по числовым значениям в вопросе. Со строками это другой вопрос, и я рекомендую вам задать его с подробностями, чтобы получить ответы на манипуляции со строками. Единственное, что я могу вам сказать, это то, что вам придется каким-то образом свернуть столбец string, например преобразовать их в список или объединить. Если вы скажете мне, как вы хотите, чтобы ваши строки обрабатывались, и это по-прежнему входит в сферу вашего вопроса, я могу соответствующим образом отредактировать свой ответ.

3. Я бы хотел, чтобы все строки в столбце возвращались в виде списка. Используя некоторые данные из вашего примера, целью вывода является teamdist = [{'a': 3.002, 'c':1.504, 'f':[w, x, y, z]}]

4. Я нашел решение, не уверен, является ли оно наиболее эффективным.

5. teamdist = [] team = pd.concat([df.sample(n=1) for df in dfposlist]) teamopw = team[['OPW']].values.sum() teamsal = team[['salary']].values.sum() teamplayers = team['playerID'].tolist() teamdic = {'Salary':teamsal, 'OPW':teamopw, 'Players':teamplayers} teamdist.append(teamdic) print(teamdist)