1
votes

comment fusionner des éléments dans dataframe

essayant de trier les éléments dans dataframe selon les besoins. J'ai importé des données d'Excel et j'utilise python / pandas pour faire des analyses.

ce sont les données que j'ai collectées, chacune correspond à l'index 1-4

[1D] index 1;2;3;4

[0E;1A;1D] index 1;2;3

[1E] index 2;3;4

Je m'attendais à afficher comme ceci:

 d   = {
        1:['0E', '1A', '1D', '2A']

        2:[ '0E', '1A', '1D', '1E', '2A']

        3:[ '0E', '1A', '1D', '1E', '2A', '3B']

        4:['1D', '1E']
       }

comment puis-je faire ça? J'ai essayé une boucle pour chaque i dans dataframe mais j'ai pu résoudre ce problème merci!


7 commentaires

À quoi ressemblent vos données réelles? Pouvez-vous partager print (df.head ()) ?


@Chris ça ressemble à un dictionnaire avec des valeurs sous forme de liste


@ min2bro Cela ressemble à ça, mais étant donné que l'OP considère cela comme des pandas, je ne sais toujours pas quelle approche serait la meilleure.


@ min2bro salut, merci pour le commentaire. OUI c'est un dictionnaire avec des valeurs sous forme de liste. J'ai essayé de copier print () vers stackoverflow mais pour une raison quelconque, il ne peut pas s'afficher correctement.


@weiyi quel est le type de sortie attendu?


@ min2bro préfère une liste. mais ce n'est pas grave parce que je devrai exporter pour exceller manuellement de toute façon.


@Chrisyes c'est un dict avec des valeurs sous forme de liste


3 Réponses :


0
votes

OK, si je comprends correctement votre question (et le format de vos données d'entrée), alors:

df1.groupby("Indices").agg(lambda x: list(x))

            Vals
Indices 
[1 2 3 4]   [1D]
[1 2 3]     [0E, 1A, 2A]
[2 3 4]     [1E]
[3]         [3B]

Développer les valeurs uniques de ce dataframe d'origine dans un nouveau dataframe: p >

df1 = pd.DataFrame()
df1["vals"] = vals
df1["indices"] = [df[df == i].stack().index.get_level_values(0).values for i in vals]

Puis groupby et agrégent pour donner:

df = pd.DataFrame([['0E', '1A', '1D', '2A'],[ '0E', '1A', '1D', '1E', '2A'], [ '0E', '1A', '1D', '1E', '2A', '3B'], ['1D', '1E']])
df.index = range(1, 5)

    0   1   2      3     4     5
1   0E  1A  1D     2A    None  None
2   0E  1A  1D     1E    2A    None
3   0E  1A  1D     1E    2A    3B
4   1D  1E  None   None  None  None

vals = np.unique(df.values.flatten()[~pd.isnull(df.values.flatten())])


0 commentaires

0
votes

Essayez celui-ci

import pandas as pd

data={1: ['0E', '1A', '1D', '2A'], 2: ['0E', '1A', '1D', '1E', '2A'], 3: ['0E', '1A', '1D', '1E', '2A', '3B'], 4: ['1D', '1E']}

data_mod = [[el, k] for k,v in data.items() for el in v]

df = pd.DataFrame(data=data_mod, columns=["el", "key"]) #el -> alphanumeric key, key -> [1,2,3,4], as per original dict keys

df_2 = df.groupby("el", as_index=False).agg(lambda x: ";".join([str(el) for el in list(set(x))])).groupby("key").agg(lambda x: list(x)) #final product, as per your question



1 commentaires

Je ne comprends pas tout à fait la logique, mais heureusement, ce code fonctionne!



0
votes

Voici une manière simple

d = {1: ['0E', '1A', '1D', '2A'],
 2: ['0E', '1A', '1D', '1E', '2A'],
 3: ['0E', '1A', '1D', '1E', '2A', '3B'],
 4: ['1D', '1E']}

df = pd.DataFrame()

for key, value in d.items():
    for x in value:
        df.loc[key, x] = str(key)

df
Out[83]: 
    0E   1A 1D   2A   1E   3B
1    1    1  1    1  NaN  NaN
2    2    2  2    2    2  NaN
3    3    3  3    3    3    3
4  NaN  NaN  4  NaN    4  NaN


0 commentaires