J'ai un dataframe appelé data il a 2 colonnes comme suit:

color  fruitN
red    apple
yellow orange
blue   banana
green  avocado

De plus, j'ai 3 fichiers différents d'une colonne; chacun contient une liste de fruits comme suit:

file1
akee
apricot
avocado

file2
avocado
bilberry
banana
blackberry

file3
blackberry
coconut
cranberry

Je dois créer une autre trame de données appelée type qui a # de lignes égales à data = 4, et # de colonnes égales au nombre de fichiers = 3

Je dois vérifier chaque fruit dans la colonne fruitN du dataframe data s'il existe dans le premier fichier, mettre 1 dans la première ligne de la première colonne et continuer à vérifier dans le fichier2 et le fichier3. Ainsi, la trame de données de sortie type devrait être comme ça:

c1 c2 c3
0  0  0
0  0  0
0  1  0
1  1  0

Ensuite, concaténé avec data pour être comme ceci:

color  fruitN c1 c2 c3
red    apple  0  0  0
yellow orange 0  0  0
blue   banana 0  1  0
green  avocado 1 1  0

Je suis débutant en python, donc toute aide serait appréciée.

1
LamaMo 20 nov. 2018 à 03:27

3 réponses

Meilleure réponse

Utilisation de isin

l=[f1,f2,f3]
for x,y in enumerate(l):
    df['c'+str(x+1)]=df.fruitN.isin(y.iloc[:,0].tolist()).astype(int)

df
Out[144]: 
    color   fruitN  c1  c2  c3
0     red    apple   0   0   0
1  yellow   orange   0   0   0
2    blue   banana   0   1   0
3   green  avocado   1   1   0
1
YOBEN_S 20 nov. 2018 à 01:58

Créez d'abord les trames de données comme:

import pandas as pd
data = pd.DataFrame(data=[["red", "apple"], ["yellow", "orange"], ["blue", "banana"], ["green", "avocado"]],
                    columns=["color", "fruitN"])
data = data.set_index("fruitN")
file_1 = ["akee", "apricot", "avocado"]
file_2 = ["avocado", "bilberry", "banana", "blackberry"]
file_3 = ["blackberry", "coconut", "cranberry"]
file_1_df = pd.DataFrame(data=[1] * len(file_1), index=file_1, columns=["type_1"])
file_2_df = pd.DataFrame(data=[1] * len(file_2), index=file_2, columns=["type_2"])
file_3_df = pd.DataFrame(data=[1] * len(file_3), index=file_3, columns=["type_3"])

Puis les concaténer avec l'axe correspondant et définir le tri sur false:

data_concat = pd.concat([data, file_1_df, file_2_df, file_3_df], axis=1, sort=False).fillna(0)

Puis choisissez les bons indices et reformatez les données de résultat comme vous le souhaitez, je l'ai fait pour obtenir exactement ce que vous avez mentionné dont vous avez besoin:

res = data_concat.loc[["apple", "orange", "banana", "avocado"]]
res.reset_index(level=0, inplace=True)
res.columns = ["fruitN", "color", "type_1", "type_2", "type_3"]
res = res.ix[:, ["color", "fruitN", "type_1", "type_2", "type_3"]]

print(res)

Il donne:

    color   fruitN  type_1  type_2  type_3
0     red    apple     0.0     0.0     0.0
1  yellow   orange     0.0     0.0     0.0
2    blue   banana     0.0     1.0     0.0
3   green  avocado     1.0     1.0     0.0

J'espère que cela peut vous aider.

0
saeed heidari 20 nov. 2018 à 02:31

Je pense que vous pouvez utiliser ceci:

data.loc[:, 'c1'] = np.where(data['fruitN'].isin(file1.values(), 1, 0)

Cela devrait créer c1, répétez pour créer les deux autres colonnes. À la fin, toutes les informations que vous souhaitez seront dans les données de la trame de données.

Vous devrez peut-être importer numpy

import numpy as pd
1
eyllanesc 20 nov. 2018 à 00:49