Если у меня есть словарь d
d = {
'Created': 35,
'Closed': 6,
'Owner': {'aName': 30, 'first.last': 3, 'last.first': 2},
'Resolution': {'TruePositive': 5, 'FalsePositive': 1},
'Severity': {2: 31, 3: 4}
}
Я бы создал несколько дополнительных ключей
_d = {
'Created': {'total': d['Created']},
'Closed': {'total': d['Closed']},
'Severity': {k: d['Severity'].get(k, 0) for k in range(1, 4)}
}
pd.DataFrame({**d, **_d})
Created Closed Owner Resolution Severity
total 35.0 6.0 NaN NaN NaN
aName NaN NaN 30.0 NaN NaN
first.last NaN NaN 3.0 NaN NaN
last.first NaN NaN 2.0 NaN NaN
TruePositive NaN NaN NaN 5.0 NaN
FalsePositive NaN NaN NaN 1.0 NaN
1 NaN NaN NaN NaN 0.0
2 NaN NaN NaN NaN 31.0
3 NaN NaN NaN NaN 4.0
Это мой способ обновления некоторых ваших ключейи мы можем видеть, что я сделал:
print(_d)
{'Created': {'total': 35}, 'Closed': {'total': 6}, 'Severity': {0: 0, 2: 31, 3: 4}}
По умолчанию конструктор pandas.DataFrame
может взять словарь и использовать ключи в качестве имен столбцов. То, что он делает со значениями, зависит от значений.
- Если значение является скаляром, оно передает этот скаляр для всех значений индекса. (Это то, что вы видели с повторяющимся
35
для всех строк в столбце 'Created'
. - Если значение является массивоподобным, длина этого элемента лучше соответствует числу строк, так какон будет поэлементно вставлять этот массив в столбец.
- Если значение является словарем, оно сопоставит каждую пару ключ / значение в столбце, где ключи являются индексными значениями.
Последний пункт мотивировал мой ответ. Я изменил скалярное значение 35
на словарь, в котором я указал значение индекса {'total': 35}
Я бы рекомендовал изменить исходный метод накак то так:
def make_dataframes(self):
# removed non-related code
counts = self._data_frame_30days['Severity'].value_counts().to_dict()
self._data_frame_counts = pd.DataFrame({
'Created': {'total': self._data_frame_30days.count()['Created']},
'Closed': {'total': self._data_frame_30days.count()['Closed']},
'Owner':
(self._data_frame_30days['Owner'].value_counts().to_dict()),
'Resolution':
(self._data_frame_30days['Resolution'].value_counts().to_dict()),
'Severity': {k: counts.get(k, 0) for k in sorted({k, *counts})}
})