Quelqu'un peut-il me guider dans ce domaine? J'ai un dictionnaire au format suivant:

date_wise_data = {
        '2018-04-09':{
            'user1': 3,
            'user2': 1,
            'user3': 1,
            'user4': 1
        },
        '2018-04-08': {
            'user1': 2,
            'user2': 0,
            'user3': 1,
            'user4': 1

        },
        '2018-04-07': {
            'user1': 6,
            'user2': 5,
            'user3': 1,
            'user4': 2
        },
        '2018-04-06': {
            'user1': 2,
            'user2': 0,
            'user3': 1,
            'user4': 1
        },
        '2018-04-05': {
            'user1': 2,
            'user2': 0,
            'user3': 2,
            'user4': 8
        },
        '2018-04-04': {
            'user1': 0,
            'user2': 0,
            'user3': 5,
            'user4': 1
        },
        '2018-04-03': {
            'user1': 8,
            'user2': 0,
            'user3': 5,
            'user4': 1
        }
}

Mon exigence est de créer un dictionnaire au format suivant:

user_data = {
        'user1':{
            '2018-04-09': 3,
            '2018-04-08': 2,
            '2018-04-07': 6,
            '2018-04-06': 2,
            '2018-04-05': 2,
            '2018-04-04': 0,
            '2018-04-03': 8
        },
        'user2': {
            '2018-04-09': 1,
            '2018-04-08': 0,
            '2018-04-07': 5,
            '2018-04-06': 0,
            '2018-04-05': 0,
            '2018-04-04': 0,
            '2018-04-03': 0

        },
        'user3': {
            '2018-04-09': 1,
            '2018-04-08': 1,
            '2018-04-07': 1,
            '2018-04-06': 1,
            '2018-04-05': 2,
            '2018-04-04': 5,
            '2018-04-03': 5
        },
        'user4': {
            '2018-04-09': 1,
            '2018-04-08': 1,
            '2018-04-07': 2,
            '2018-04-06': 1,
            '2018-04-05': 8,
            '2018-04-04': 1,
            '2018-04-03': 1
        }
}

J'ai essayé de diviser le dict en utilisant des clés et des valeurs. J'ai essayé de rejoindre plusieurs dict. Mais je ne parviens pas à recevoir la sortie dans le format ci-dessus.

Sur la base de votre expérience en Python, l'un de vous peut-il me suggérer une voie à suivre ou m'aider à cet égard.

Merci,

0
Sreenath 13 avril 2018 à 11:39

6 réponses

Meilleure réponse

La réponse à cette question est relativement simple, il suffit de parcourir les dictionnaires et d'affecter les valeurs au bon endroit, par exemple:

for date, users in date_wise_data.items():
  for user, value in users.items():
    user_wise_data[user][date] = value

La partie la plus délicate ici est que ces dictionnaires n'existeront pas, donc ce code ne fonctionnera pas. Bien que vous puissiez vérifier cela manuellement et les construire, l'option la plus simple consiste à utiliser un defaultdict pour les construire automatiquement. Par exemple:

user_wise_data = collections.defaultdict(dict)

Cela signifie que chaque fois que vous essayez d'accéder à un utilisateur qui n'existe pas, un nouveau dictionnaire est créé pour lui. Cela fait que le code ci-dessus fait exactement ce que vous voulez:

>>> import collections
>>> date_wise_data = {
...   '2018-04-09':{
...     'user1': 3,
...     'user2': 1
...   },
...   '2018-04-08': {
...     'user1': 2,
...     'user2': 0
...   }
... }
>>> user_wise_data = collections.defaultdict(dict)
>>> 
>>> for date, users in date_wise_data.items():
...   for user, value in users.items():
...     user_wise_data[user][date] = value
... 
>>> user_wise_data
defaultdict(<class 'dict'>, {
    'user1': {
        '2018-04-09': 3, 
        '2018-04-08': 2
    }, 
    'user2': {
        '2018-04-09': 1, 
        '2018-04-08': 0
    }
})

Une autre option est dict.setdefault() qui vous permet de le faire au moment de l'accès, plutôt que lorsque vous configurez le dictionnaire, par exemple:

user_wise_data = {}
for date, users in date_wise_data.items():
   for user, value in users.items():
     user_wise_data.setdefault(user, {})[date] = value
3
Gareth Latty 13 avril 2018 à 08:55

Vous pouvez utiliser des pandas:

import pandas as pd

df = pd.DataFrame(date_wise_data).transpose()
print(df.head())

#             user1  user2  user3  user4
# 2018-04-03      8      0      5      1
# 2018-04-04      0      0      5      1
# 2018-04-05      2      0      2      8
# 2018-04-06      2      0      1      1
# 2018-04-07      6      5      1      2

Convertissez la trame de données en un dictionnaire:

print(df.to_dict())

# {'user1': {'2018-04-03': 8, '2018-04-04': 0, '2018-04-05': 2, '2018-04-06': 2, '2018-04-07': 6, '2018-04-08': 2, '2018-04-09': 3}, 'user2': {'2018-04-03': 0, '2018-04-04': 0, '2018-04-05': 0, '2018-04-06': 0, '2018-04-07': 5, '2018-04-08': 0, '2018-04-09': 1}, 'user3': {'2018-04-03': 5, '2018-04-04': 5, '2018-04-05': 2, '2018-04-06': 1, '2018-04-07': 1, '2018-04-08': 1, '2018-04-09': 1}, 'user4': {'2018-04-03': 1, '2018-04-04': 1, '2018-04-05': 8, '2018-04-06': 1, '2018-04-07': 2, '2018-04-08': 1, '2018-04-09': 1}}
2
Darius M. 13 avril 2018 à 09:02

Tout d'abord, nous aplatissons les données à 2 niveaux que vous avez dans date_wise_data:

>>> flat_data = [(j, k, u) for k, v in date_wise_data.items() for j, u in v.items()]
>>> flat_data.sort() # we sort data for groupby()
>>> flat_data
[('user1', '2018-04-03', 8), ('user1', '2018-04-04', 0), ..., ('user2', '2018-04-03', 0), ...]

Ensuite, nous utilisons itertools.groupby qui "renvoie des clés consécutives et groupes de l'itérable "(notez que groupby nécessite que son argument soit trié pour fonctionner correctement):

>>> {key: {item[1]: item[2] for item in grouper}
        for key, grouper in groupby(flat_data, lambda x: x[0])}
{'user1': {'2018-04-03': 8,
           '2018-04-04': 0,
           '2018-04-05': 2,
           '2018-04-06': 2,
           '2018-04-07': 6,
           '2018-04-08': 2,
           '2018-04-09': 3},
 'user2': {'2018-04-03': 0,
           '2018-04-04': 0,
           '2018-04-05': 0,
           '2018-04-06': 0,
           '2018-04-07': 5,
           '2018-04-08': 0,
           '2018-04-09': 1},
 'user3': {'2018-04-03': 5,
           '2018-04-04': 5,
           '2018-04-05': 2,
           '2018-04-06': 1,
           '2018-04-07': 1,
           '2018-04-08': 1,
           '2018-04-09': 1},
 'user4': {'2018-04-03': 1,
           '2018-04-04': 1,
           '2018-04-05': 8,
           '2018-04-06': 1,
           '2018-04-07': 2,
           '2018-04-08': 1,
           '2018-04-09': 1}}
1
fferri 13 avril 2018 à 09:09

Voici ce que je ferais:

user_data = {}
for date in date_wise_data:
    for user in date_wise_data[date]:
        if user not in user_data:
            user_data[user] = {}
        user_data[user][date] = date_wise_data[date][user]

Notez que les clés date et user sont utilisées dans l'ordre inverse sur la dernière ligne.

1
Aemyl 13 avril 2018 à 10:52

Cela fera le travail:

d = {}
for date in date_wise_data:
   for user in date_wise_data[date]:
      if user not in d:
         d[user]={}
      d[user][date] = date_wise_data[date][user]
0
s.singh 13 avril 2018 à 09:07

Je pense que vous avez peut-être mal saisi votre sortie, car elle ne correspond pas à votre entrée. Comme le commente @pissal, la sortie que vous avez demandée n'est pas possible.

Je suppose que vous voulez que votre sortie soit:

user_data = {
        'user1':{
            '2018-04-09': 3,
            '2018-04-08': 2,
            '2018-04-07': 6,
            '2018-04-06': 2,
            '2018-04-05': 2,
            '2018-04-04': 0,
            '2018-04-03': 8
        },

Ensuite, vous voulez du code comme:

for date, users in date_wise_data.items()
    for user, value in users.items()
        user_data[user][date] = value

Modifié pour inclure: vous devrez peut-être utiliser defaultdict comme spécifié dans la réponse de @Gareth Latty

0
EdR 13 avril 2018 à 08:51