#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)